Kann ich programmgesteuert herausfinden, in welcher GC-Generation eine Instanz lebt?

8

Diese Frage beschränkt sich auf HotSpot-Generationen . Gibt es eine Möglichkeit, programmgesteuert herauszufinden, in welcher Generation eine bestimmte Instanz lebt? Daten wie:

  • Junge oder alte Generation?
  • Wenn jung, welcher Überlebende Raum?
  • Innerhalb TLAB? Welcher Thread?

Jede Technik (z. B. BTrace , JVMTI ) funktioniert, solange ich so etwas tun kann:

%Vor%

Bettler können nicht wählerisch sein, aber im Idealfall könnte ich auch lernen, wenn die Instanz von Interesse von einer Generation zur nächsten verschoben wird in dem Moment, in dem sie passiert (dh Ereignisrückruf basierend - nicht interessiert in der Verzögerung und im Overhead, die im Polling enthalten sind.)

Nicht an Antworten interessiert, die einfach "nein" ohne Begründung sagen :)

    
Brian Harris 16.12.2010, 00:36
quelle

2 Antworten

4

Soweit ich weiß, können Sie nicht direkt abfragen, in welchem ​​Speicherpool ein Objekt derzeit lebt. Objekte werden jedoch durch einen Garbage Collection-Lauf in einen anderen Speicherpool heraufgestuft, und Sie können die Anzahl der Haupt- / Neben-GCs abfragen läuft seit VM starten mit JMX. Wenn Sie beim Erstellen des Objekts zusätzlich diese Zähler zur Kenntnis nehmen, können Sie nachvollziehen, ob es seit und von dem Pool, in dem das Objekt lebt, einen GC gab.

    
meriton 16.12.2010, 02:30
quelle
3

Es gibt eine zusätzliche Komplikation bei der Vorgehensweise "Anzahl der GCs seit der Erstellung des Objekts zählen" - die vorzeitige Objekt-Promotion wird nicht berücksichtigt.

Wenn die Überlebendenräume grundsätzlich zu klein sind und der Speicherdruck von Eden hoch ist (dh die Rate der mindestens einmal überlebenden Objekte), werden die Objekte auf "Tenure" gesetzt, bevor sie die volle Tenuring-Schwelle erreichen.

In realen Beispielen haben gesunde Anwendungen normalerweise einen Prozentsatz von nicht null Prozent der vorzeitigen Werbung. In der Tat ist eine frühzeitige Aufstiegsrate von 0% ein wirklich schlechtes Zeichen - es sagt, dass Ihre Überlebendenräume viel, viel zu groß sind und Sie viel Speicher verschwenden.

    
kittylyst 01.02.2012 15:23
quelle