2016-06-22 20 views
0

Ich habe einen interessanten Effekt in Bezug auf Laufzeitspeicheranalyse mit dem MemoryMXBean. Ich möchte den freien Speicher in Heap zusammen mit NonHeap ermitteln. So sieht mein Code wie folgt aus:Java MemoryMXBean Used Memory größer als Max

static MemoryMXBean mbean = ManagementFactory.getMemoryMXBean(); 
long fullused = mbean.getHeapMemoryUsage().getUsed() + mbean.getNonHeapMemoryUsage().getUsed(); 
long fullmax = mbean.getHeapMemoryUsage().getMax() + mbean.getNonHeapMemoryUsage().getMax(); 
long fullfree = fullmax - fullused; 

Manchmal ist das Ergebnis für fullFree ein negativer Wert ist. Wie kann das sein? Eine Race-Bedingung, dass einige Garbage Collection nach der Berechnung für die verwendeten Mem gemacht wurde? In meinen Logbüchern sehe ich es oft, also bezweifle ich die Race-Condition-Theorie. Irgendwelche anderen Gedanken hier?

Antwort

0

Max für NonHeap kann -1 sein. Sie können das über jconsole für Ihre Anwendung überprüfen. In Hotspot-Quellen erfolgt die Berechnung der Speichernutzung in jmm_GetMemoryUsage Methode. Wenn einer der Nicht-Heap-Speicherpools nicht definierte maximale Größe hat, wird die maximale Größe im gesamten Nicht-Heap-Wert -1 sein. Der Metaspace-Pool (ohne MaxMetaspaceSize-Befehlsflag) hat eine nicht definierte maximale Größe

+0

Danke, ich werde einen Check dafür einbauen. – magicroomy