2013-02-18 11 views
6

Ich führe ein bestimmtes Java-Programm mit seiner -Xmx höher als -Xms, d. H. Sein Heap kann wachsen. Die Heap-Größe am Ende der Ausführung ist (IIRC) nicht das Maximum, das während des Laufs verwendet wurde.Wie kann ein Java-Programm die maximale tatsächliche Größe des Heapspeichers verfolgen, die während seiner Ausführung verwendet wurde?

  • Wie kann ich die aktuelle Heap-Größe erhalten?
  • Wie kann ich die maximale Größe des Heapspeichers während des Laufs ermitteln, außer dass ich die aktuelle Größe "selbst" regelmäßig abfrage?

Antwort

2

// aktuelle Größe des Heap in Bytes Get

long heapSize = Runtime.getRuntime().totalMemory(); 

// maximale Größe des Heap in Bytes übernehmen. Der Heap kann nicht über diese Größe hinaus wachsen.// Jeder Versuch führt zu einer OutOfMemoryException.

long heapMaxSize = Runtime.getRuntime().maxMemory(); 

// Get Menge an freiem Speicher innerhalb des Heap in Bytes. Diese Größe erhöht sich // nach der Garbage Collection und verringert sich, wenn neue Objekte erstellt werden.

long heapFreeSize = Runtime.getRuntime().freeMemory(); 
+0

Ist es nützlich für Sie. –

2

Wenn Sie es von Ihrem Programm inspizieren wollen sich die Methoden der Runtime-Klasse verwenden:

Runtime.getRuntime().freeMemory() 
Runtime.getRuntime().maxMemory() 

Wenn es ok für Sie die Heap-Größe von außerhalb des Programms zu überprüfen, sollten Sie Verwenden Sie JVisualVM. Sie finden es im Ordner bin Ihres JDK. Starten Sie es einfach und hängen Sie es an Ihr Java-Programm an, um einen Einblick in die Heap-Nutzung Ihres Programms zu erhalten. Es wird ein Diagramm Ihrer Heap-Auslastung angezeigt, sodass Sie die maximale Heap-Größe des Programmlaufs leichter finden können.

4

Holen Sie sich aktuelle Heap-Größe:

public static long getHeapSize(){ 
    int mb = 1024*1024; 

    //Getting the runtime reference from system 
    Runtime runtime = Runtime.getRuntime(); 

    return ((runtime.totalMemory() - runtime.freeMemory())/mb); 
} 
1

Siehe Laufzeit. Info:

Runtime.getRuntime().maxMemory(); 
Runtime.getRuntime().totalMemory(); 
Runtime.getRuntime().freeMemory(); 
2

Die anderen Antworten geben die Mechanik über Runtime.getRuntime tun() totalmemory() und MaxMemory(), sei aber SEHR vorsichtig - die gegebene Antwort wird nur zu einem gegebenen Zeitpunkt wahr sein. Nach einem GC ändert sich totalMemory() (nach unten!). Sie können nicht immer genau sehen, wie viele Live-Objekte sich im System befinden - GC berechnet genau das und ist teuer.

Die Verwendung von JMX (Siehe die GC-Bean, etc ..) wird bei dieser Abfrage helfen, aber es ist auch eine Probe im Laufe der Zeit.

Also ich bin mir nicht sicher, was Sie hier eigentlich zu lösen versuchen ...

Verwandte Themen