Warum erscheint der Java Garbage Collector kurz nach einer weniger aggressiven Ausführung aggressiv?

8

Beim Überwachen eines Java-Programms mit VisualVM habe ich ein interessantes Muster im Verhalten des Garbage Collectors bemerkt. Es scheint sehr oft zu sein, dass der GC direkt nach einem "normalen" Garbage Collection-Lauf einen zweiten, viel mehr CPU-intensiven Lauf ausführt, der keinen zusätzlichen Effekt zu haben scheint (Der verwendete Heap nach dem aggressiveren Lauf ist ungefähr derselbe wie Es ist nach dem leichteren Lauf).

Ich habe in der VisualVM-Ausgabe angegeben, wo Sie die Garbage Collector-Läufe und die entsprechenden Heap-Nutzungsänderungen sehen können.

Meine Frage ist im Grunde, was macht der Müllsammler hier und warum? Was verursacht es, diese wirklich cpu-intensiven Läufe zu versuchen, wenn es viel freien Gedächtnis gibt, und keinen beobachtbaren Vorteil gegen die leichteren Läufe? Oder interpretiere ich den Graphen falsch?

Die Leistung des Programms ist nicht wirklich betroffen, ich bin nur neugierig.

    
Gordon Bailey 01.04.2013, 21:19
quelle

1 Antwort

2

Das Betrachten von Graphen ist eine gute Sache, um einen Überblick über GC-Läufe zu erhalten. Wenn Sie jedoch untersuchen möchten, warum der GC in einem bestimmten Moment ausgeführt wird, müssen Sie in die GC-Protokolle eintauchen.

Aktivieren Sie die vollständige GC-Protokollierung, fangen Sie auch an, jstat zu sammeln. Konzentrieren Sie sich auf jene Zeiten, in denen Sie unerwartete GC-Zyklen sehen und diese in den Protokollen zurückverfolgen. Was siehst du dort? Versuche zu sehen:

  • ist es Voll oder Minder GC?
  • Was sind Berufe von eden, Dauerwelle, altGen, Überlebenden, etc?
  • Wie lauten die Zuweisungsraten, die Größe des Live-Datensets und die Promotion-Raten in diesen Intervallen?
  • usw.

Das Beantworten dieser Fragen könnte zu dem Problem führen, warum der GC ausgeführt wird.

UPDATE : Hier finden Sie technische Details zum Einstellen von GC, z. in: Gibt es ein Kochbuch für GC-Probleme?

    
Ales 01.04.2013, 22:21
quelle