System.gc() ?

flashray

Erfahrenes Mitglied
Hallo,

verwendet ihr in euren Programmen eigentlich System.gc(). Wenn ich mit meinem Editor eine Große Textdatei lade, oder in der neu implementierten Druckvorschau blättere, oder zoome kommt es vor das:
"Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space" !

Ist es zu empfehlen, wenn man mit großen Daten seis String oder Images arbeitet, System.gc() aufzurufen? Wenn ja wie und wo sollte man ihn am besten implementieren?


Vg Erdal
 
2. Frage zu Speicherverbrauch:

JLabel label = new JLabel();
label = null;
label = new JLabel();

Wird der GC den Speicher für das zuerst erstellte Objekt freigeben, weil keine Referenz darauf besteht, oder bleibt dieser weiterhin bestehen?

3. Frage zu Speicherverbrauch:

Was sind die häufigsten Fehler bei String und Image Operationen die den Speicher voll laufen lassen? Was wird oft vergessen?

Welche Maßnahmen kennt ihr den Speicherverbrauch zu minimieren?

Wo könnte ich einen Artikel oder ähnliches darüber lesen?


Vielen Dank!

Vg Erdal
 
Hallo Freunde,

Was ist mit JMX, wäre sie hierfür hilfreich:

4. Könnte man mit Hilfe von JMX ausfindig machen, welcher String, welches Image Objekt genau wieviel Speicher verbraucht, um genau die ineffiziente Stelle im Programm zu finden, um sie zu verbessern. Es würde auch reichen speicherfressende, belastende Objekte herauszufinden, um diese ressourcenschonender zu implementieren.


Vg Erdal
 
Zu Frage 1:
In einem Profiler siehst Du wie der Speicherverbrauch sinkt. Aber in einer Realen VM ist das System.gc() nur eine Empfehlung an den GC mal den Speicher zu untersuchen. Es ist nichtgarantiert das, dass auch passiert.
Zu 2:
Jain, es besteht zwar keine Referenz mehr auf dieses Objekt, allerdings läuft der GC nicht ständig mit. Somit kann es sein das dieses Objekt erst am Ende des Programms zerstört wird.
 
Hallo!

Hallo!

Ist es zu empfehlen, wenn man mit großen Daten seis String oder Images arbeitet, System.gc() aufzurufen? Wenn ja wie und wo sollte man ihn am besten implementieren?
Eigentlich sollte man System.gc()-Aufrufe vermeiden. Wie NomadSould schon richtig sagte, wird bei einem System.gc() Aufruf nicht notwendigerweise
ein GC ausgefuehrt. Der GC bekommt nur einen Hinweis, dass er an der naechsten Moeglichen Gelegenheit laufen soll.

2. Frage zu Speicherverbrauch:

JLabel label = new JLabel();
label = null;
label = new JLabel();

Wird der GC den Speicher für das zuerst erstellte Objekt freigeben, weil keine Referenz darauf besteht, oder bleibt dieser weiterhin bestehen?
Ob die erste JLabel-Instanz direkt vom GC freigegeben wird haengt u.a. davon ab, wie der Heap-Speicher derzeit ausgelastet ist.
Ist dieser schon stark beansprucht, ist die Wahrscheinlichkeit hoeher, dass ein GC durchgefuehrt und die Instanz vom Heap entfernt wird.

3. Frage zu Speicherverbrauch:

Was sind die häufigsten Fehler bei String und Image Operationen die den Speicher voll laufen lassen? Was wird oft vergessen?

Welche Maßnahmen kennt ihr den Speicherverbrauch zu minimieren?
Die haeufigsten Fehler bei der Arbeit mit Objekten ist der, dass grosse Objekte
(grosse Strings, grosse Bilder) ueber "harte" Referenzen laenger im Speicher behalten
werden, als eigentlich notwendig. Ein weiterer haeufiger Fehler bei Swing oder allgemein
GUI Anwendungen ist der, dass EventListener bei verschiedenen Widgets registriert,
aber spaeter nicht mehr deregistriert werden, was das aufsammeln dieser durch den GC verhindert.

Was ist mit JMX, wäre sie hierfür hilfreich:

4. Könnte man mit Hilfe von JMX ausfindig machen, welcher String, welches Image Objekt genau wieviel Speicher verbraucht, um genau die ineffiziente Stelle im Programm zu finden, um sie zu verbessern. Es würde auch reichen speicherfressende, belastende Objekte herauszufinden, um diese ressourcenschonender zu implementieren.
Das kannst du mit Standard JMX AFAIK nicht... dafuer musst du schon einen Profiler bemuehen der ueber das JVM TI (Tool Interface)
in den Innereinen der JVM nachschaut.

Gruss Tom
 
Hallo,

herzlichen Dank an NomadSoul und Tom.

Das war schon sehr Hilfreich.

Eine letzte Frage hätte ich noch: "harte" Referenzen . Wie meinst du dass?

Vg Erdal
 
Genau: Was meinst Du mit "harten" Referenzen?

Ich hab da nähmlich ein ähnliches Problem. Ich lese Daten aus einer großen Textdatei zeilenweise aus. Ich weis welche Daten in welcher Reihnfolge in der Text Datei stehen und will diese dann in eine Datenbank einspeisen.
Also:
Code:
BufferedReader br = new BufferedReader(new FileReader(importFile));
while (line != null)
{
	line = br.readLine();
	if (line == null) break;
	String[] tupels = line.split(";");
        ...
        hier kommt dann der DBImport mit aufteilung der Daten auf mehrere Tabellen;
        ....
}
br.close();

Ich brauche ja eigentlich nie mehr als eine Zeile gleichzeitig im Speicher.
wenn die textdatei größer als ca. 1300 Zeilen ist dann kommt:
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space

2. Frage: Wie kann ich die Anzahl der Zeilen aus einer Textdatei herausfinden?
-> für JProgressBar.

3. Frage: In einem anderen Prog will ich die Daten einer SQL-Tabelle in einer JTable mit JScrollPane anzeigen. Bei großen Tabellen habe ich dann auch wieder dieses Speicherproblem. Welche möglichkeit gibt es hier?
 
Hallo,

ich denke mal das Tom mit "harten" Referenzen Variablen meint, die nicht erst in der Methode erzeugt werden, in der sie gebraucht werden, und nach der Methode wieder verschwinden, sondern welche die während der gesamten Laufzeit vorhanden sind und wenn diese natürlich viel Speicher brauchen, besetzen sie den Speicher die ganze Zeit.

@tekilla
ich denke mal dass bei dir wegen dem BufferedReader der OutOfMemoryError kommt. Der puffert ja den ganzen Text aus der Datei. Das ist aber halt nur eine Vermutung.
Weißt du denn bei welcher Zeile der Error auftritt?

MFG

zEriX
 
Zum GC...dieser wird in der Regel nur ausgeführt, wenn der Heap Speicher voll läuft und hält damit die Applikation bei vielen Daten schonmal ne Sekunde auf. Dazu kommt es beim Heap Speicher Graphen zu einem Sägezahn.

Wenn ihr das sehen wollt benutzt die JConsole, die ab Java 5 in der JDK dabei ist. (Bei 5 muss man einen Parameter zur Anwendung mitgeben um es benutzen zu können, bei 6 ist dies nicht nötig(außer bei jmx))

Wenn der Speicher trotzdem nicht ausreicht solltet ihr euren Heap Speicher (und vielleicht andere Speicherbereiche) vielleicht erhöhen, dies lässt sich jedoch nur beim Starten der Anwendung festlegen.
Simple. For example, the java option -Xmx768m gives it a 768MByte heap, maximum but starts with just a 2MB heap. You can add -Xms256m (for example) to make the heap start at 256MB - this can be more CPU efficient if your going to need that larger space anyway, but a waste if you don't.
Dies erhöht jedoch nicht den permgen Speicherbereich, welches alle strukturellen Klassen/Methodeninfromationen bereithält.Dieser ist bei einer Anwendung normalerweise relativ konstant. Außer z.B. bei Testserver, wo man Sachen während dem Betrieb deployed/undeployed...jedoch gibt es auch einen alten jvm bug, dass beim undeployen nicht alle Daten entfernt werden. Dadurch kann es nach einigen "hot-deployments" zu einem OutOfMemory permgen kommen.
 
Hallo,

ich denke mal das Tom mit "harten" Referenzen Variablen meint, die nicht erst in der Methode erzeugt werden, in der sie gebraucht werden, und nach der Methode wieder verschwinden, sondern welche die während der gesamten Laufzeit vorhanden sind und wenn diese natürlich viel Speicher brauchen, besetzen sie den Speicher die ganze Zeit.

@tekilla
ich denke mal dass bei dir wegen dem BufferedReader der OutOfMemoryError kommt. Der puffert ja den ganzen Text aus der Datei. Das ist aber halt nur eine Vermutung.
Weißt du denn bei welcher Zeile der Error auftritt?

MFG

zEriX

Hi zerix,

harte Referencen sind normale Referenzen. Wenn keine harten Referenzen auf ein Object zeigen wird es gelöscht. Ein "vergessener" Zeiger führt zu einem Speicherleck. Deshalb gibt es in Java auch weiche Refrenzen.

Sieh mal hier:

http://www.gruntz.ch/papers/references.pdf

Gruss
 

Neue Beiträge

Zurück