JAX 2011 - Garbage collection verstehen

Preview:

DESCRIPTION

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.

Citation preview

Garbage Collection verstehen

3 JVMs – ähnlich aber doch verschieden

• Langsam? Wann und Warum

• Auswirkungen

• Jede JVM ist anders

• GC Strategien & Richtiges Tuning

• Probleme und Lösungen

Die Basics

GC Roots

Erreichbare Objekte

Nicht Erreichbare

Objekte Garbage

Vergessene Referenz

Memory Leak

GC auf einen Blick

Viele (über)lebende Objekte

=

Lange Garbage Collection

Generational Heap

• Wenige Allokationen

• Viele Überlebende

• Viele Allokationen

• Wenige Überlebende

Marking Phase

Nach Copy PhaseSpeicher nach Sweep

Marking Phase

Runtime Suspensions

Performance Auswirkungen

Suspensions

• Alle Anwendungs Threads pausieren

• Auch Young/Minor Collections!

• Antwortzeiten 1:1

• Durchsatz Exponentiell

Suspensions

Serial Collector Parallel Collector

Pause

Pause

Remark

Concurrent

Mark

Concurrent Collector

Concurrent

Sweep

Fragmentierung

Performance Auswirkungen

Speicher nach Sweep

Marking Phase

Fragmentierung

Compacting GC

• Young Generation Copy Collection

• Old Generation (außer CMS)

Fragmentierter Speicher

Speicher nach Kompaktifizierung

CPU Verbrauch

Performance Auswirkungen

CPU Verbrauch

• Zeit ≈ CPU Zeit

• Seriell <≈ Parallel

• Je mehr CPUs desto kürzer Suspension

• Negative Auswirkung auf andere

Prozesse

• CMS single Threaded

Jede JVM ist anders

Die Unterschiede

SUN/ORACLE JVM

Eden

Surv

ior

Surv

ior

Young Tenured

ORACLE JROCKIT

Heap

• Generational

oder

• Kontinuierlicher Heap

Keep

Are

a

Nursery Tenured

Mostly Concurrent

Mark and Sweep

Pause

Final Remark

Concurrent Mark

& remark

Sweep 1. Hälfte

Sweep 2. HälftePause

Compacting Windows

• Inkrementelles Compacting

• Auch bei CMS

Fragmentierter Speicher

Thread-Lokale Allokation

• Separatere Heap Bereiche

• Dynamische Zuteilung

• Keine Synchronisation

Schnellere Allokation

„GROßE“ UND „KLEINE“

OBJEKTE

Permanent Generation?

• Klassen werden wie Objekte behandelt

• Sofortige Garbage Collection möglich!

IBM JVM

Die Unterschiede

• Kontinuierlicher Heap ist Standard

• Allocate und Survivor

• „Große“ und „Kleine“ Objekte

• Keine Permanent Generation

Allo

cate

Surv

ior

Nursery Tenured

TUNING

Garbage Collection

Das Ziel vor Augen halten

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

Richtig Messen

• Suspensions messen

Auswirkung auf Antwortzeit

• Garbage Collection Zeit/CPU messen

• Garbage Collection Häufigkeit messen

JMX Metriken

Echte Auswirkung

Auf die Größe kommt es an

• Objekt stirb Young

• Old Generation abspecken

• Richtiges Verhältnis

Objekt Churning

• Allokiere so viel du willst, aber

– nicht zu viel

– nicht zu lange

• Cachen ist gut, aber

– Nicht zu viel

– Nicht zu kurz

PROBLEME, MYTHEN,

LEGENDEN

Minor vs. Major

• Minor Collections pausieren auch!

• Old Generation ≠ Major Collection

Zu großer Heap

• Lange und teure Garbage Collections

• Caches

– HTTP-Session as Cache

– Soft/Weak Referenzen

• Memory Leaks

Memory Leaks

• Statische veränderliche Variablen

• Thread Lokale Variablen

• JNI

• Equals/Hashcode

• 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

Bi-direktionale Referenzen

Classloader Probleme

• Class Loader Leaks

• Mehrfach geladene Klassen

• Zu viele, große Klassen

• Wiederholtes Laden

Out Of Memory

• GC Thrashing

• Transaktionaler Speicherverbrauch

• Große temporare Objekte

• Permanent Generation

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);

FRAGEN

Michael Kopp

michael.kopp@dynatrace.com

@mikopp

http://blog.dynatrace.com

Recommended