Garbage Collection ist nicht gleich Garbage Collection. Neben den grundsätzlich unterschiedlichen Ansätzen wie parallel und concurrent, verfolgen alle JVM's hier unterschiedliche Strategien und das Verhalten unterscheidet sich beträchtlich. Diese Session erläutert die grundsätzlichen Strategien und Tuning Möglichkeiten. Wir widmen uns im Besonderen den Unterschieden im Verhalten und Tuning der drei grossen JVMs Sun, JRockit und IBM. Zuletzt werden erläutern wir die häufigsten Probleme, wie sie erkannt und gelöst werden können.
6. Generational Heap
• Wenige Allokationen
• Viele Überlebende
• Viele Allokationen
• Wenige Überlebende
Marking Phase
Marking Phase
Speicher nach Sweep Nach Copy Phase
14. CPU Verbrauch
• Zeit ≈ CPU Zeit
• Seriell <≈ Parallel
• Je mehr CPUs desto kürzer Suspension
• Negative Auswirkung auf andere
Prozesse
• CMS single Threaded
25. Die Unterschiede
• Kontinuierlicher Heap ist Standard
• Allocate und Survivor
• „Große“ und „Kleine“ Objekte
• Keine Permanent Generation
Nursery Tenured
Allocate
Survior
28. GC Strategien
Antwortzeit Durchsatz
Kontinuierlicher Heap Kleine Anwendungen,
Clients, evtl mit CMS
Ja, Parallel GC
Generational Heap Ja Ja, parallel GC
Concurrent Mark and
Sweep
Server Nein, außer wenn
Suspension sensitiv
Parallel GC Young, Nicht old Ja
38. Bi-direktionale Referenzen
Document doc = readXmlDocument();
Node child =
doc.getDocumentElement().getFirstChild();
doc.removeNode(child);
doc = null;
// child hat eine Referenz auf doc,
// daher doc wird nicht freigegeben
39. Classloader Probleme
• Class Loader Leaks
• Mehrfach geladene Klassen
• Zu viele, große Klassen
• Wiederholtes Laden
40. Out Of Memory
• GC Thrashing
• Transaktionaler Speicherverbrauch
• Große temporare Objekte
• Permanent Generation
41. Große Temp. Objekte
byte tmpData[] = new byte [1024];
int offs = 0;
do{
int readLen = bis.read (tmpData, offs, tmpData.length -
offs);
if (readLen == -1)
break;
offs+= readLen;
if (oofs == tmpData.length){
byte newres[] = new byte[tmpData.length + 1024];
System.arraycopy(tmpData, 0, newres, 0, tmpData.length);
tmpData = newres;
}
} while (true);
42. FRAGEN
Michael Kopp
michael.kopp@dynatrace.com
@mikopp
http://blog.dynatrace.com
Hinweis der Redaktion
Wie funktioniert GC eigentlich, GC Roots, traverse objects. Nicht erreichbare objekte?
Das ist eine Krux und wir werden sehen das sich das durchzieht. Einerseits haben werden sehr viele kurzlebige Objekte erzeugt die der Garbage Collector effizient entfernt, andererseits haben heutige Applikationen eine immer groessere anzahl von lang lebigen Objekten.
Der concurrent wird allerdings fast nur bei einem normallen mark and sweep. Also nicht in der young generation. Wir sehen hier schon das das ganze ein trade off ist. Es werden zwar die unterbrechungen kuerzer, allerdings steigt dadurch der CPU verbrauch. Das ist etwas das man immer bedenken muss, mann kann nur fuer eine seite tunen.
Allokationen werden langsamer
Sweep Phase wird langsamer
OutOfMemory bei grossen objekten
Vorteil des copy collectors
Kompletter Heap
Parallel
CMS gar nicht? Das gilt fuer die Sun JVM wohlgemerkt!
Objekte im eden angelegt, dann in einen aktiven survivor promoted. Dann so oft hin und her kopiert bis die kriterien erfuellt sind.
Das geht nicht immer. Young Gen Garantie!
Missing perm generation. haellt
Kontinuierlicher und Generationaler Heap
Internal/external
Response time vs. CPU Verbrauch aka Throughput.
Das problem mit allokationen ist oftmals nicht einmal der GC selbst, sondern das allokieren an und fuer sich.
Und natuerlich wenn ich mehr objekte erzeuge als im young platz haben.
Caches Soft Referenzen
Sun jvm oom, wenn zuviel gc
Ineffizienter Code
Major Collections ohne ersichtlichen Grund
Out Of Memory mit genügend freiem Speicher