Почему Tomcat всегда увеличивает использование памяти и никогда не освобождает ее? - PullRequest
0 голосов
/ 01 мая 2020

У меня есть Unix сервер с tomcat с одним веб-приложением.

Если я делаю бесплатно, -HI просмотр около 50% используется: С верхней командой: я просматриваю этот процесс:

 21603 azureus+  20   0 7816556 1.104g  18200 S   0.0  45.1   0:36.41 


    /usr/lib/jvm/java-8-oracle/bin/java -Djava.util.logging.config
.file=/home/azureuser/tomcat/apache-tomcat-9.0.8/conf/logging.properties -Djava.util.loggi
ng.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.
protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.Secu
rityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/azureuser/tomcat/apache-t
omcat-9.0.8/bin/bootstrap.jar:/home/azureuser/tomcat/apache-tomcat-9.0.8/bin/tomcat-juli.j
ar -Dcatalina.base=/home/azureuser/tomcat/apache-tomcat-9.0.8 -Dcatalina.home=/home/azureu
ser/tomcat/apache-tomcat-9.0.8 -Djava.io.tmpdir=/home/azureuser/tomcat/apache-tomcat-9.0.8
/temp org.apache.catalina.startup.Bootstrap start

Используйте 45% памяти.

Я хочу понять, является ли проблема моего кода в моих проектах или проблемой TOMCAT. Мое приложение представляет собой приложение Springboot с 2 контроллерами:

здесь код: https://pastebin.com/yq5F0XTG

У меня есть 2 функции:

  • getAllTests, вызываемый requestController -> getTestList (), использующий URLClassLoader, но в конце я закрываю его с помощью:

    child.close();
    j.close() <--for JarFile that I load
    child=null;
    System.gc()
    
  • runOne, вызываемый requestController -> runTest (), также здесь он используется ClassLoader, но в конце я закрываю его:

    loader=null;
    System.gc();
    

    Когда я вызываю getTestList () и отслеживаю память сверху, я вижу, что экземпляр TOMCAT увеличивает использование памяти с 13,2 до 13,7, но в конце он не уменьшается. Также с увеличением памяти runTest (), но после завершения метода runOne () оно не уменьшается ..

После многих обращений к функции контроллера у меня возникают проблемы с памятью (использование 60-70%) .

Это проблема конфигурации tomcat или проблема моего кода?

PS: Я не могу установить ничего на unix сервер, потому что у меня нет привилегии root и VisualVM не работает с моей windows локальной машины ...

Пожалуйста, помогите мне.

Спасибо всем за любые советы ..

1 Ответ

1 голос
/ 02 мая 2020

Если что-то не изменилось в текущих JVM, о которых я не знаю: JVM не освобождает память для операционной системы , если она не использует: она освобождает своя куча, но вы настроили ее при запуске, позволяя до -Xmx памяти. И это то, что нужно (плюс некоторые).

Если ваше приложение может обойтись меньшим объемом памяти: измените эту конфигурацию. Однако, как только эта память будет превышена, ваша JVM прекратит работу с условием OutOfMemory.

Выбирайте эту конфигурацию с умом и имейте в виду: вы явно разрешили своей JVM использовать этот объем памяти. Не смущайтесь, если это отнимает у вас это пособие.

В производственных системах я обычно устанавливаю -Xmx равным -Xms, чтобы убедиться, что JVM захватывает всю память при запуске, вместо того, чтобы не выделять больше из ОС в ночь на выходные, вызывая сбой когда я не хочу получать оповещения.

...