+ All Categories
Home > Software > JAX 2011 - Garbage collection verstehen

JAX 2011 - Garbage collection verstehen

Date post: 09-Jul-2015
Category:
Upload: michael-kopp
View: 125 times
Download: 1 times
Share this document with a friend
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.
42
Garbage Collection verstehen 3 JVMs ähnlich aber doch verschieden
Transcript
Page 1: JAX 2011 - Garbage collection verstehen

Garbage Collection verstehen

3 JVMs – ähnlich aber doch verschieden

Page 2: JAX 2011 - Garbage collection verstehen

• Langsam? Wann und Warum

• Auswirkungen

• Jede JVM ist anders

• GC Strategien & Richtiges Tuning

• Probleme und Lösungen

Page 3: JAX 2011 - Garbage collection verstehen

Die Basics

Page 4: JAX 2011 - Garbage collection verstehen

GC Roots

Erreichbare Objekte

Nicht Erreichbare

Objekte Garbage

Vergessene Referenz

Memory Leak

GC auf einen Blick

Page 5: JAX 2011 - Garbage collection verstehen

Viele (über)lebende Objekte

=

Lange Garbage Collection

Page 6: JAX 2011 - Garbage collection verstehen

Generational Heap

• Wenige Allokationen

• Viele Überlebende

• Viele Allokationen

• Wenige Überlebende

Marking Phase

Nach Copy PhaseSpeicher nach Sweep

Marking Phase

Page 7: JAX 2011 - Garbage collection verstehen

Runtime Suspensions

Performance Auswirkungen

Page 8: JAX 2011 - Garbage collection verstehen

Suspensions

• Alle Anwendungs Threads pausieren

• Auch Young/Minor Collections!

• Antwortzeiten 1:1

• Durchsatz Exponentiell

Page 9: JAX 2011 - Garbage collection verstehen

Suspensions

Serial Collector Parallel Collector

Pause

Pause

Remark

Concurrent

Mark

Concurrent Collector

Concurrent

Sweep

Page 10: JAX 2011 - Garbage collection verstehen

Fragmentierung

Performance Auswirkungen

Page 11: JAX 2011 - Garbage collection verstehen

Speicher nach Sweep

Marking Phase

Fragmentierung

Page 12: JAX 2011 - Garbage collection verstehen

Compacting GC

• Young Generation Copy Collection

• Old Generation (außer CMS)

Fragmentierter Speicher

Speicher nach Kompaktifizierung

Page 13: JAX 2011 - Garbage collection verstehen

CPU Verbrauch

Performance Auswirkungen

Page 14: JAX 2011 - Garbage collection verstehen

CPU Verbrauch

• Zeit ≈ CPU Zeit

• Seriell <≈ Parallel

• Je mehr CPUs desto kürzer Suspension

• Negative Auswirkung auf andere

Prozesse

• CMS single Threaded

Page 15: JAX 2011 - Garbage collection verstehen

Jede JVM ist anders

Die Unterschiede

Page 16: JAX 2011 - Garbage collection verstehen

SUN/ORACLE JVM

Eden

Surv

ior

Surv

ior

Young Tenured

Page 17: JAX 2011 - Garbage collection verstehen

ORACLE JROCKIT

Page 18: JAX 2011 - Garbage collection verstehen

Heap

• Generational

oder

• Kontinuierlicher Heap

Keep

Are

a

Nursery Tenured

Page 19: JAX 2011 - Garbage collection verstehen

Mostly Concurrent

Mark and Sweep

Pause

Final Remark

Concurrent Mark

& remark

Sweep 1. Hälfte

Sweep 2. HälftePause

Page 20: JAX 2011 - Garbage collection verstehen

Compacting Windows

• Inkrementelles Compacting

• Auch bei CMS

Fragmentierter Speicher

Page 21: JAX 2011 - Garbage collection verstehen

Thread-Lokale Allokation

• Separatere Heap Bereiche

• Dynamische Zuteilung

• Keine Synchronisation

Schnellere Allokation

Page 22: JAX 2011 - Garbage collection verstehen

„GROßE“ UND „KLEINE“

OBJEKTE

Page 23: JAX 2011 - Garbage collection verstehen

Permanent Generation?

• Klassen werden wie Objekte behandelt

• Sofortige Garbage Collection möglich!

Page 24: JAX 2011 - Garbage collection verstehen

IBM JVM

Page 25: JAX 2011 - Garbage collection verstehen

Die Unterschiede

• Kontinuierlicher Heap ist Standard

• Allocate und Survivor

• „Große“ und „Kleine“ Objekte

• Keine Permanent Generation

Allo

cate

Surv

ior

Nursery Tenured

Page 26: JAX 2011 - Garbage collection verstehen

TUNING

Garbage Collection

Page 27: JAX 2011 - Garbage collection verstehen

Das Ziel vor Augen halten

Page 28: JAX 2011 - Garbage collection verstehen

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

Page 29: JAX 2011 - Garbage collection verstehen

Richtig Messen

• Suspensions messen

Auswirkung auf Antwortzeit

• Garbage Collection Zeit/CPU messen

• Garbage Collection Häufigkeit messen

Page 30: JAX 2011 - Garbage collection verstehen

JMX Metriken

Page 31: JAX 2011 - Garbage collection verstehen

Echte Auswirkung

Page 32: JAX 2011 - Garbage collection verstehen

Auf die Größe kommt es an

• Objekt stirb Young

• Old Generation abspecken

• Richtiges Verhältnis

Page 33: JAX 2011 - Garbage collection verstehen

Objekt Churning

• Allokiere so viel du willst, aber

– nicht zu viel

– nicht zu lange

• Cachen ist gut, aber

– Nicht zu viel

– Nicht zu kurz

Page 34: JAX 2011 - Garbage collection verstehen

PROBLEME, MYTHEN,

LEGENDEN

Page 35: JAX 2011 - Garbage collection verstehen

Minor vs. Major

• Minor Collections pausieren auch!

• Old Generation ≠ Major Collection

Page 36: JAX 2011 - Garbage collection verstehen

Zu großer Heap

• Lange und teure Garbage Collections

• Caches

– HTTP-Session as Cache

– Soft/Weak Referenzen

• Memory Leaks

Page 37: JAX 2011 - Garbage collection verstehen

Memory Leaks

• Statische veränderliche Variablen

• Thread Lokale Variablen

• JNI

• Equals/Hashcode

• Bi-direktionale Referenzen

Page 38: JAX 2011 - Garbage collection verstehen

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

Page 39: JAX 2011 - Garbage collection verstehen

Classloader Probleme

• Class Loader Leaks

• Mehrfach geladene Klassen

• Zu viele, große Klassen

• Wiederholtes Laden

Page 40: JAX 2011 - Garbage collection verstehen

Out Of Memory

• GC Thrashing

• Transaktionaler Speicherverbrauch

• Große temporare Objekte

• Permanent Generation

Page 41: JAX 2011 - Garbage collection verstehen

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

Page 42: JAX 2011 - Garbage collection verstehen

FRAGEN

Michael Kopp

[email protected]

@mikopp

http://blog.dynatrace.com


Recommended