2011-06-27 11 views
5

Używam Eclipse. Problem polega na tym, że moja aplikacja ulega awarii, jeśli przydzielona pamięć jest mniejsza niż 512 MB. Czy mimo to istnieje możliwość sprawdzenia dostępnej pamięci dla programu przed rozpoczęciem intensywnego przetwarzania wyczerpującej pamięci? Na przykład, wiem, możemy sprawdzić dostępną wielkość sterty JVM jak:Sprawdź programowo dostępną wielkość pliku heapSize?

long heapSize = Runtime.getRuntime().totalMemory(); 
System.out.println("Heap Size = " + heapSize); 

Problem jest, daje to wielkość sterty JVM. Nawet zwiększenie to nie działa przy użyciu Eclipse. W Eclipse, jeśli zmienię argumenty VM, to działa. Jednak wydruk z powyższych stwierdzeń jest zawsze taki sam. Czy istnieje jakieś polecenie, dzięki któremu mogę dokładnie wiedzieć, ile pamięci przydzielam dla konkretnej aplikacji?

+0

może problemem jest zaćmienie. Czy próbowałeś Netbeans lub IntelliJ? – telm

+0

Próbowałem, to taki sam wynik z dowolnym IDE – Johnydep

+0

Runtime ma zarówno totalMemory() i maxMemory(). maxMemory jest większy w moim doświadczeniu. –

Odpowiedz

13

Można użyć JMX, aby zebrać wykorzystanie pamięci sterty w środowisku wykonawczym.


Kod Przykład:

import java.lang.management.ManagementFactory; 
import java.lang.management.MemoryPoolMXBean; 
import java.lang.management.MemoryType; 
import java.lang.management.MemoryUsage; 

for (MemoryPoolMXBean mpBean: ManagementFactory.getMemoryPoolMXBeans()) { 
    if (mpBean.getType() == MemoryType.HEAP) { 
     System.out.printf(
      "Name: %s: %s\n", 
      mpBean.getName(), mpBean.getUsage() 
     ); 
    } 
} 

Wyjście Przykład:

Name: Eden Space: init = 6619136(6464K) used = 3754304(3666K) committed = 6619136(6464K) max = 186253312(181888K) 
Name: Survivor Space: init = 786432(768K) used = 0(0K) committed = 786432(768K) max = 23265280(22720K) 
Name: Tenured Gen: init = 16449536(16064K) used = 0(0K) committed = 16449536(16064K) max = 465567744(454656K) 

jeżeli twój pytanie o "Eden Space" czy "Survivor Kosmicznej", sprawdź How is the java memory pool divided

+0

Yess, ale to naprawdę pomaga. Chcę tylko znać całkowitą przydzieloną pamięć do mojej aplikacji przez JVM lub coś podobnego. Z konfiguracji wiem, że jest to mniej niż 512 MB, to nie działa. Ale jak mogę to sprawdzić pragmatycznie, ponieważ gdy ta aplikacja zostanie spakowana, jeśli ulegnie awarii w czasie wykonywania, powinien pojawić się mechanizm informujący o rodzaju błędu. W gorszym przypadku złapię wyjątek i zachęcisz użytkownika do zwiększenia rozmiaru pamięci, ale to będzie po awarii, ale nie przed startem. Niestety, trwa to około 30 minut, zanim dojdzie do awarii i byłoby stratą czasu. – Johnydep

+0

Czy ustawiłeś JAVA_OPTS lub CATALINA_OPTS? Co z parametrem '-Xmx' (maksymalny rozmiar sterty)? Może się zawiesza, ponieważ w pewnym momencie nie ma w nim pamięci? Co mówią pliki dziennika, wszelkie błędy OutOfMemory? – Danijel

0

Co powiesz na ten pomysł? Możesz sprawdzić JVM command line with this API.

Następnie można zeskanować wiersz poleceń dla parametrów -Xmx…, aby upewnić się, że podano wystarczająco dużą stertę.

Powiązane problemy