为什么tomcat总是增加内存使用量而不释放它?

问题描述 投票:0回答:1

我有一个装有Tomcat的Unix服务器,里面有一个webapps。

如果我做free -h,我查看大约50%的使用量:用top命令:我查看这个进程。

 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%的内存。

我想知道是我的代码在myprojects中的问题还是tomcat的问题,我的应用程序是一个带有2个控制器的springboot应用程序。

这里是代码。https:/pastebin.comyq5F0XTG

我有两个函数。

  • getAllTests由requestController调用->getTestList(),使用了URLClassLoader,但我在最后用:getAllTests关闭。

    child.close();
    j.close() <--for JarFile that I load
    child=null;
    System.gc()
    
  • runOne由 requestController -> runTest()调用,这里也使用了ClassLoader,但我最后用:runOne关闭了它。

    loader=null;
    System.gc();
    

    当我调用getTestList()并监控内存时,我发现TOMCAT实例的内存使用量增加了13.2到13.7,但最后并没有减少,而且runTest()的内存也增加了,但在runOne()方法结束后并没有减少。

在多次调用控制器函数后,我出现了内存问题(60-70%的使用率)。

是Tomcat配置的问题还是我的代码的问题?

PS:我不能在unix服务器上安装任何东西,因为我没有root权限,而且VisualVM不能在我的windows本地机器上工作......

请帮助我。

谢谢大家的任何提示...

tomcat memory-management classloader
1个回答
1
投票

除非当前的JVM有什么变化,我不知道。JVM不会释放内存 到操作系统,如果不使用它。它就会腾出手来 其自身 堆,但你在启动时已经配置好了,允许最多使用 -Xmx 记忆力。这就是它所需要的(加上一些)。

如果你的应用程序可以用更少的内存来相处。那就改变配置 但是,一旦超过了这个内存,你的JVM就会以OutOfMemory条件终止。

明智地选择该配置,并牢记。你已经明确地允许你的JVM用掉那个数量的内存。如果它占用了你的那个允许量,不要感到困惑。

在生产系统中,我通常将 -Xmx 与...相当 -Xms 以确保JVM在启动时抓取所有的内存,而不是在周末的晚上不能从操作系统分配更多的内存,导致在我不想被提醒的时候发生故障。

© www.soinside.com 2019 - 2024. All rights reserved.