【发布时间】:2020-05-02 22:35:54
【问题描述】:
我有一个带有 tomcat 的 Unix 服务器,里面有一个 webapps。
如果我执行 free -h 我查看大约 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% 的内存。
我想了解是我在 myprojects 中的代码的问题还是 TOMCAT 的问题。 我的应用是一个带有 2 个控制器的 springboot 应用:
这里是代码:https://pastebin.com/yq5F0XTG
我有两个功能:
-
由使用 URLClassLoader 的 requestController ->getTestList() 调用的 getAllTests 但我最后用以下命令关闭它:
child.close(); j.close() <--for JarFile that I load child=null; System.gc() -
requestController 调用的runOne -> runTest() 也在这里它使用 ClassLoader 但我最后用以下方式关闭它:
loader=null; System.gc();当我调用 getTestList() 并使用 top 监视内存时,我认为 TOMCAT 实例将内存使用量从 13.2 增加到 13.7,但最终它并没有减少。 同样随着 runTest() 内存增加,但在方法 runOne() 结束后它不会减少..
多次调用控制器功能后,我的内存出现问题(60-70% 的使用率)。
是tomcat配置问题还是我的代码问题?
PS:我无法在 unix 服务器上安装任何东西,因为我没有权限 root 并且 VisualVM 不能在我的 Windows 本地机器上工作...
请帮帮我。
感谢大家的任何提示..
【问题讨论】:
标签: tomcat memory-management classloader