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?

questionAnswers(2)

yourAnswerToTheQuestion