Diese Frage beschränkt sich auf HotSpot-Generationen . Gibt es eine Möglichkeit, programmgesteuert herauszufinden, in welcher Generation eine bestimmte Instanz lebt? Daten wie:
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 :)
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.
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.
Tags und Links java garbage-collection jvm-hotspot jvm jvmti