2010-05-21 11 views
7

Chcę obliczyć zużycie sterty dla mojej aplikacji. Chciałbym uzyskać wartość procentową wielkości sterty tylko.Jak uzyskać tylko wolny rozmiar sterty (nie razem w stos/mem metody) w Javie?

Jak uzyskać wartość kodu dla bieżącej aplikacji?

EDIT

Było odpowiedzią upvoted że był niekompletna/poprawne. Wartości zwrócone przez te metody obejmują także obszar stosu i metody, a ja potrzebuję monitorować tylko wielkość sterty.
Z tym kodem mam wyjątek HeapError kiedy osiągnęła 43%, więc nie mogę korzystać z tych metod, aby monitorować tylko kupa

Runtime.getRuntime().totalMemory() 

Odpowiedz

2

odpowiedź dbyme jest nie dokładna - te rozmowy środowiska daje ilość pamięci używane przez JVM, ale ta pamięć nie składa się tylko z sterty, istnieje również stos i obszar metody, np.

+0

To prawda. Otrzymuję błąd pamięci Heap, kiedy osiągnęłam 43% wykorzystania. – Pentium10

+0

Dobra rozmowa. Naprawdę jestem zainteresowany, aby znać teraz poprawną odpowiedź. – dbyrne

1

Ta informacja jest wyświetlana w interfejsie zarządzania JMX. Jeśli po prostu chcesz na to spojrzeć, JConsole lub visualvm (część JDK zainstalowanego w JAVA_HOME/bin) może wyświetlać ładne wykresy użycia pamięci maszyny JVM, opcjonalnie podzielone na różne pule pamięci.

Dostęp do tego interfejsu można również uzyskać programowo; patrz MemoryMXBean.

+0

Ponieważ jestem na Androidzie, nie mam do nich dostępu. – Pentium10

+0

Spróbuj bezpośrednio użyć interfejsu. Dodałem link, aby zacząć. – meriton

0

Tam naprawdę nie jest dobre rozwiązanie, ponieważ ile pamięci sterty JVM ma wolną nie jest taka sama jak ilość pamięci sterty system operacyjny ma wolną, które są zarówno nie to samo, ile pamięci sterty można przypisać do aplikacji.

Dzieje się tak, ponieważ sterty JVM i OS są różne. Gdy w maszynie JVM zabraknie pamięci, może uruchomić zbieranie śmieci, defragmentować własną stertę lub zażądać więcej pamięci od systemu operacyjnego. Ponieważ nieużywane obiekty, które nie zostały usunięte ze śmieci, ale są technicznie "wolne", sprawiają, że koncepcja wolnej pamięci jest nieco rozmyta.

Również fragmenty sterty; jak/kiedy pamięć jest defragmentowana, zależy od implementacji JVM/OS. Na przykład sterta systemu operacyjnego może mieć 100 MB wolnej pamięci, ale z powodu fragmentacji największa dostępna przestrzeń ciągła może wynosić 2 MB. Jeśli więc JVM zażąda 3 MB, może uzyskać błąd braku pamięci, mimo że 100 MB jest nadal dostępne. JVM nie jest w stanie wiedzieć z wyprzedzeniem, że system operacyjny nie będzie w stanie przydzielić tego 3 MB.

+0

Jak możesz wykryć, że Twoja aplikacja jest w krytycznym nastroju, osiągając ten poziom? – Pentium10

+0

@ Pentium10: [Uruchom Javę z dużą stertą] (http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html#0.0.0.%20Total%20Heap|outline), a następnie, gdy chcesz to sprawdzić, uruchom ręcznie garbage collector i sprawdź później wolną przestrzeń. Powiedziałbym, że wszystko poniżej 40% jest złe, ale jak zauważyliście, można zabraknąć pamięci z jeszcze większą ilością wolnej pamięci.Ręczne uruchamianie modułu czyszczenia pamięci jest * bardzo * wolne i nie jest to coś, co chcesz zrobić w konkretnej aplikacji. Dlaczego to robisz? –

+0

Mam rodzaj procesu generowania wycofywania uruchomionego na urządzeniu mobilnym z systemem Android, gdzie nie mogę uruchomić Java z dużą stertą. Muszę przerwać proces generowania, zanim będzie za późno. – Pentium10

1

MemoryMXBean bean = ManagementFactory.getMemoryMXBean(); bean.getHeapMemoryUsage(). GetUsed();

Powiązane problemy