Использование памяти JVM вышло из-под контроля

У меня есть веб-приложение Tomcat, которое выполняет некоторые задачи, требующие большого объема памяти и ресурсов процессора, от имени клиентов. Это нормально и является желаемой функциональностью. Однако когда я запускаю Tomcat, использование памяти со временем возрастает до 4,0 ГБ, и в этот момент я обычно убиваю процесс, поскольку он портит все остальное, работающее на моей машине для разработки:

enter image description here

Я думал, что случайно произвел утечку памяти в моем коде, но после проверки в VisualVM я вижу другую историю:

enter image description here

VisualVM показывает, что куча занимает примерно ГБ ОЗУ, что я и сделал с этимCATALINA_OPTS="-Xms256m -Xmx1024".

Почему моя система воспринимает этот процесс как занимающий тонну памяти, когда, согласно VisualVM, он практически не занимает ничего?

Немного понюхав еще раз, я заметил, что если в приложениях одновременно выполняется несколько заданий, память не освобождается. Однако, если я подожду завершения каждой работы, прежде чем отправить другуюBlockingQueue обслуживаетсяExecutorService, то память эффективно перерабатывается. Как я могу отладить это? Почему отличается сборка мусора / повторное использование памяти?

Ответы на вопрос(2)

Ваш ответ на вопрос