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

为什么tomcat总是增加内存使用而从不释放它?,tomcat,memory-management,classloader,Tomcat,Memory Management,Classloader,我有一个带有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/apac

我有一个带有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%的内存

我想知道这是我的项目代码的问题还是TOMCAT的问题。 我的应用程序是一个springboot应用程序,带有2个控制器:

代码如下:

我有两个功能:

  • 使用URLClassLoader的requestController->getTestList()调用的getAllTests,但最后我用以下命令将其关闭:

    child.close();
    j.close() <--for JarFile that I load
    child=null;
    System.gc()
    
    loader=null;
    System.gc();
    
    当我调用getTestList()并用top监视内存时,我认为TOMCAT实例会将内存使用率从13.2增加到13.7,但最终并没有减少。 同样,runTest()内存会增加,但在方法runOne()结束后不会减少

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

这是tomcat配置的问题还是我的代码的问题

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

请帮帮我


感谢所有提示。

除非当前JVM中发生了一些我不知道的变化:JVM不会向操作系统释放内存,如果它不使用它:它会释放自己的堆,但您已经在启动时对其进行了配置,最多允许
-Xmx
内存。这就是它所需要的(加上一些)

如果您的应用程序可以使用更少的内存:更改该配置。但是,一旦超出该内存,JVM将以OutOfMemory条件终止

明智地选择该配置,并记住:您已经明确允许JVM使用该数量的内存。如果这需要你的零用钱,不要感到困惑


在生产系统中,我通常将
-Xmx
设置为
-Xms
,以确保JVM在启动时获取所有内存,而不是在周末晚上无法从操作系统分配更多内存,在我不想被提醒时导致故障。

您好,谢谢您的answe,所以对您来说,是Tomcat设置的问题,不在我的代码中?如果这是真的,那么我会将其告知unix系统管理员。你确定吗?我在网上看到,我调用类加载器后,它没有释放内存。。但是我不确定您是否应该检查JVM自己的堆以确保JVM中的内存再次被释放。但我认为这是正常操作,JVM从不将内存释放回操作系统。您所描述的内容并没有给出应用程序内存泄漏的任何提示,但也不能排除这种情况?在这个服务器中,我认为这两个选项没有设置,因此在很长一段时间后会填满整个内存。在哪里配置它?这取决于您的实现。我见过的最标准的位置是tomcat的
bin/setenv.sh
(一个您必须自己创建的文件)。它通常是一些用于启动tomcat的shell脚本。在Windows上,如果tomcat作为服务安装,则它位于服务配置中(通常在安装服务时设置)。JVM不太可能耗尽所有内存—它们有一个默认限制,您需要显式覆盖它才能使用大量内存。啊,好的,谢谢。。那么对你来说类加载器不是问题吗?