2010-06-01 3 views
7

Ich möchte Speicherzuweisung Daten aus meiner Java-Anwendung, d. H. Die Summe der Größe aller Objekte, die zugewiesen wurden. Da die Objektzuordnung in der jungen Generation erfolgt, scheint dies der richtige Ort zu sein.Wie man die Summe der gesammelten Erinnerung der jungen Generation misst?

Ich kenne jconsole und ich kenne die JMX-Beans, aber ich kann einfach nicht die richtige Variable finden ... Genau im Moment analysieren wir die GC-Log-Ausgabedatei, aber das ist ziemlich schwierig. Idealerweise möchten wir es über JMX messen ...

Wie kann ich diesen Wert erhalten?

Weitere Informationen nach Kommentar von Chadwick:

Ich möchte wissen, wie viel Speicher meiner Anwendung verwendet. Es ist eine ziemlich große Software, die auf einem JBoss App-Server läuft. Alle 4 Wochen gibt es eine neue Version der Software und wir müssen den Speicherverbrauch zwischen alter und neuer Version vergleichen. Es ist nicht genug, um den aktuellen Wert der alten Generation zu einem bestimmten Zeitpunkt zu vergleichen. Es ist sehr nützlich zu wissen, wie viel mehr oder weniger Speicher zugewiesen wird. Da viele Objekte in der jungen Generation gesammelt werden, muss ich sie dort messen.

In der Zwischenzeit habe ich eine Schätzung dafür. Ich werde es als Antwort posten.

Danke, Marcel

+11

Ist Facebook nicht die gesammelte Erinnerung der jungen Generation? * Enten und Läufe ... * –

+0

Sehr schön ;-) Aber macht es nicht einfacher, die Zuweisungsgröße zu bestimmen – Marcel

+0

Fragen Sie, wie viel Speicher während eines Zeitraums zugewiesen wird oder wie viel Speicher während eines bestimmten Laufs zurückgewonnen wird der GC? Scheint, dass dein Titel nach einem fragt, aber die Frage fragt nach dem anderen, und ich würde denken, dass der GC mehrere Male während eines Zeitraums laufen könnte, so dass das Ermitteln des endgültigen gesammelten Speichers keine genaue "Gesamtzuteilungssumme" ergibt. Ja, das könnte gemildert werden, aber ein Anwendungsfall würde zur Klärung beitragen. – Chadwick

Antwort

1

Das ist meine Idee einer Schätzung. Es gibt im Grunde den Wert von "Anzahl der jungen Sammlungen x Größe der jungen Generation" zurück. Es ist nicht perfekt, aber funktioniert gut für meinen Anwendungsfall.

public long getYoungGenAllocatedMB() { 
    long youngMaxMemory; 
    long youngUsedMemory; 
    long youngCollectionCount; 

    List<MemoryPoolMXBean> beans = ManagementFactory.getMemoryPoolMXBeans(); 
    for (MemoryPoolMXBean bean : beans) { 
    if ("Par Eden Space".equals(bean.getName())) { 
     MemoryUsage usage = bean.getUsage(); 
     youngMaxMemory = usage.getMax(); 
     youngUsedMemory = usage.getUsed(); 
     break; 
    } 
    } 

    List<GarbageCollectorMXBean> gBeans = ManagementFactory.getGarbageCollectorMXBeans(); 
    for (GarbageCollectorMXBean bean : gBeans) { 
    if ("ParNew".equals(bean.getName())) { 
     youngCollectionCount = bean.getCollectionCount(); 
     break; 
    } 
    } 

    return (youngCollectionCount * youngMaxMemory + youngUsedMemory)/1024/1024; 
} 

Danke an alle anderen Plakate!

Marcel

+0

Ab Java7u4 besteht die Möglichkeit einen Listener mit GarbageCollectorMXBean zu registrieren. Das funktioniert besser, Beispiel: http://www.fasterj.com/articles/gcnotifs.shtml – Marcel

1

Yourkit Profiler bietet eine gute Aufschlüsselung auf Speichernutzung. Es gibt eine Testversion bei http://www.yourkit.com/download/index.jsp

+0

Ich kenne verschiedene Profiler. Keiner von ihnen kann in Produktionsumgebungen verwendet werden. Aber ich möchte in der Produktion messen! – Marcel

+0

In der Tat, ich schlug es vor, weil ich es in der Produktion auf einer großen Website mit minimalen Auswirkungen verwenden – Ceilingfish

+0

Ok, aber es ist nicht verwendbar, weil wir dann> 30 Lizenzen benötigen. Ich würde lieber mit einer billigeren Lösung gehen. – Marcel

3
+0

Ich kenne JMX Remoting. Ich kenne die Memory-MBeans. Aber wo bekomme ich den gewünschten Wert: Die Gesamtsumme der Größe aller allokierten Objekte? – Marcel

2

Wenn Sie die Sonne verwenden JDK, können Sie einfach GC-Protokollierung mit -verbose:gc -Xloggc:gc.log aktivieren und die Datei analysieren. Oder, wenn Sie die Gesamtmenge nur gelegentlich benötigen, erhalten Sie die GCViewer von Tagtraum, die die Nummer berechnet, die Sie suchen.

+0

Ja, ich kenne beide Werkzeuge. Löst es nicht. Ich brauche diesen Wert zur Laufzeit in meiner Anwendung. – Marcel

1

Ich habe es nicht persönlich benutzt, aber haben Sie versucht jmap?

Die Option -heap druckt generationsweise Heap-Nutzung.

ist ein Tool mit jdk gebündelt, so dass es kostenlos und wahrscheinlich nicht viel Aufwand hat.

+0

Ja, ich kenne jmap. Aber ich möchte die Werte von meiner Java-Anwendung selbst bestimmen. So ist Jstat keine Option. – Marcel

1

Was ist mit diesem Code, es gibt Ihnen die Summe der Bytes in allen Räumen (eden, Überlebenden, alt & Dauerwelle), die ziemlich viel ist der gesamte Speicher von Ihrer Instanz von JVM verwendet wird.

+0

Richtig, aber ich muss den Speicherverbrauch abfragen und wenn es zwei oder mehr gcs zwischen meinen Umfragen gibt, werde ich sie vermissen. Ich dachte entweder an einen "ereignisbasierten" Mechanismus (mit jedem GC informiert werden) oder an einen bestehenden Wert, der die Gesamtsumme der zugewiesenen jungen Generation enthält. – Marcel