Użycie pamięci JVM poza kontrolą
Mam aplikację WWW Tomcat, która wykonuje w imieniu klientów pewne zadania wymagające dużej ilości pamięci i procesora. Jest to normalne i pożądana funkcjonalność. Jednak po uruchomieniu Tomcata użycie pamięci z czasem wzrasta do 4,0 GB, w którym zwykle zabijam ten proces, ponieważ wszystko to działa na moim komputerze programistycznym:
Myślałem, że nieumyślnie wprowadziłem przeciek pamięci z moim kodem, ale po sprawdzeniu w VisualVM widzę inną historię:
VisualVM pokazuje stertę jako zajmującą około GB pamięci RAM, z którą to robięCATALINA_OPTS="-Xms256m -Xmx1024"
.
Dlaczego mój system postrzega ten proces jako zajmujący mnóstwo pamięci, gdy zgodnie z VisualVM prawie wcale nie zajmuje?
Po nieco dalszym wąchaniu zauważam, że jeśli w aplikacjach jednocześnie uruchomionych jest wiele zadań, pamięć nie zostanie zwolniona. Jeśli jednak czekam na zakończenie każdego zadania, przed przesłaniem kolejnego do mojegoBlockingQueue
serwisowany przez anExecutorService
, następnie pamięć jest skutecznie przetwarzana. Jak mogę to zdebugować? Dlaczego różni się zbieranie pamięci / ponowne użycie pamięci?