2013-02-18 8 views
6

Używam określonego programu Java, z opcją -Xmx wyższą niż -Xms, tzn. Jego stertą może rosnąć. Rozmiar sterty na końcu wykonywania jest (IIRC), a nie maksymalna używana podczas biegu.W jaki sposób program Java może śledzić maksymalny rzeczywisty rozmiar sterty używanego podczas jego uruchamiania?

  • Jak mogę uzyskać bieżący rozmiar sterty?
  • Jak mogę uzyskać maksymalny rozmiar sterty w trakcie biegu, poza okresowym odpytywaniem bieżącego rozmiaru "siebie"?

Odpowiedz

2

// Pobiera aktualny rozmiar sterty w bajtach

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

// Uzyskanie maksymalnego rozmiaru sterty w bajtach. Sterty nie mogą rosnąć powyżej tego rozmiaru .// Każda próba spowoduje wyjątek OutOfMemoryException.

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

// Uzyskaj ilość wolnej pamięci w stercie w bajtach. Ten rozmiar zwiększy rozmiar // po usunięciu śmieci i zmniejszeniu w miarę tworzenia nowych obiektów.

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

Czy to ci się przyda. –

2

Jeśli chcesz sprawdzić go z samego programu, za pomocą metod klasy Runtime:

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

Jeśli to jest ok, aby sprawdzić wielkość sterty spoza programu, należy użyj JVisualVM. Możesz go znaleźć w folderze bin Twojego JDK. Po prostu uruchom go i dołącz do programu java, aby uzyskać wgląd w wykorzystanie sterty programów. Wyświetli wykres wykorzystania twojego sterty, dzięki czemu łatwo znajdziesz maksymalny rozmiar sterty w przebiegu twojego programu.

4

Pobiera aktualny rozmiar stosu:

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

Zobacz wykonawczego informację:.

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

Pozostałe odpowiedzi udzieli mechanikę robić poprzez Runtime.getRuntime() totalMemory() i Maxmemory(), ale bądź BARDZO ostrożny - udzielona odpowiedź będzie prawdą tylko w danej chwili. Po GC, totalMemory() zmieni się (w dół!). Nie można uzyskać dokładnego obrazu "ile obiektów na żywo znajduje się w systemie" przez cały czas - ponieważ właśnie to oblicza GC i jest kosztowne.

Pomoże to w odpytywaniu przy użyciu JMX (patrz komponent GC itp.), Ale z czasem jest to próbka.

Więc nie jestem pewien, co tak naprawdę próbujesz rozwiązać ...

Powiązane problemy