2012-03-12 13 views
6

W mojej aplikacji uruchamiam wątki z niezaufanym kodem, więc muszę zapobiec przepełnieniu pamięci. Mam WatchDoga, który analizuje czas bieżącego wątku (wątki były wywoływane seryjnie). Ale w jaki sposób mogę określić zużycie pamięci? Znam tylko użycie pamięci całej maszyny wirtualnej z Runtime.totalMemory()? Jeśli istnieje możliwość sprawdzenia użycia wątku lub użycia pojedynczego procesu, byłoby świetnie. Przy użyciu pamięci procesu można i tak obliczyć użycie wątku.Wykorzystanie pamięci wątku lub procesu w Javie

+6

Z definicji wątek dzieli tę samą przestrzeń pamięci, co inne wątki w procesie. Twoje pytanie nie ma większego sensu. JVM = proces. 1 proces ma wiele wątków. –

+0

JVM = proces, co oznacza, że ​​każdy proces Java ma własną maszynę JVM? – Nicolas

+0

Tak. Po uruchomieniu języka Java uruchamiasz nową maszynę JVM. –

Odpowiedz

2

Ponieważ JVM wykonująca program w języku Java jest procesem Java, nie musisz się o to martwić. Wszystkie wątki mają tę samą pamięć w procesie JVM.

Stąd wystarczy polegać na

0

Co trzeba zrobić, to uruchomić kod niezaufane we własnym procesie/JVM. Jest to możliwe dzięki interfejsom JNI (jeśli pozwala na to twój system operacyjny).

1

Aplikacja Java nie może kontrolować ilości pamięci lub (lub CPU) używanej przez jej wątki, niezależnie od tego, czy wątki używają zaufanego, czy niezaufanego kodu. Nie ma żadnych interfejsów API do wykonania tego w przypadku JVM obecnej generacji. A na pewno nie ma API do monitorowania użycia pamięci przez wątek. (Nie jest nawet jasne, czy jest to znacząca koncepcja ...)

Jedynym sposobem na zagwarantowanie kontroli wykorzystania niezaufanego kodu Java jest uruchomienie kodu w oddzielnej maszynie JVM i użycie poziomu systemu operacyjnego kontrola zasobów (np. ulimit, nice, sigstop, itp.) i "-Xmx" w celu ograniczenia wykorzystania zasobów JVM.


Jakiś czas temu firma Sun wyprodukowała JSR 121 w celu rozwiązania tego problemu. Ten JSR umożliwiłby podział aplikacji na części (zwane "izolatami"), które komunikują się za pośrednictwem przekazywania komunikatów, i umożliwiłby jednemu izolatowi monitorowanie i kontrolowanie innego. Niestety API Isolate nie zostały jeszcze wdrożone w żadnej głównej maszynie JVM.

Powiązane problemy