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
Odpowiedz
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
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).
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.
- 1. Ograniczanie użycia procesora/pamięci wątku w Javie?
- 2. Rosnące wykorzystanie pamięci rezydentnej (RSS) procesu Java
- 3. Uruchamianie oddzielnego procesu lub wątku w Qt
- 4. Jak zmierzyć wykorzystanie pamięci sterty szczytowej w Javie?
- 5. Zatrzymywanie wątku w Javie?
- 6. Szyny Tworzenie nowego wątku lub procesu w tle
- 7. Dstat Wykorzystanie procesora dla jednego określonego procesu
- 8. Wykorzystanie pamięci w kontenerach Docker
- 9. Szybkie sprawdzanie lub ograniczanie użycia pamięci wątku w .NET?
- 10. Timer zwiększa wykorzystanie pamięci w C# app
- 11. Odtwórz wykorzystanie pamięci szkieletowej
- 12. Doktryna wykorzystanie pamięci zapytanie
- 13. Praktyczne wykorzystanie pamięci wirtualnej
- 14. Wykorzystanie pamięci ArangoDB
- 15. Pomiar pamięci szczytowej długotrwałego procesu w Linuksie
- 16. Jak profilować wykorzystanie pamięci?
- 17. Analizowanie zrzutów wątku procesu java
- 18. Jak zmniejszyć wykorzystanie pamięci Netbeans?
- 19. jest ładne() używane do zmiany priorytetu wątku lub priorytetu procesu?
- 20. Wieloplatformowy sposób na wykorzystanie procesora/pamięci
- 21. Jak analizować wykorzystanie pamięci ze zrzutu pamięci?
- 22. Wykorzystanie pamięci: Program przydziela zbyt dużo pamięci
- 23. Wywołanie funkcji w wątku tła/procesu (rozwidlone)
- 24. Wykorzystanie pamięci scikit-learning DBSCAN
- 25. monitorować wykorzystanie pamięci programu w systemie Linux
- 26. Uzyskaj aktualne wykorzystanie pamięci WKWebView?
- 27. Sieciowe wykorzystanie procesu przy użyciu PowerShell
- 28. jak zmniejszyć wykorzystanie pamięci solr?
- 29. String VS Byte [], wykorzystanie pamięci
- 30. Wykorzystanie pamięci Spark/przędzy Python
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. –
JVM = proces, co oznacza, że każdy proces Java ma własną maszynę JVM? – Nicolas
Tak. Po uruchomieniu języka Java uruchamiasz nową maszynę JVM. –