如何配置tomcat,以便以前运行的类不会保留在内存中

时间:2018-09-12 12:06:01

标签: java tomcat server

tomcat/manager上,当我单击find leaks按钮时,收到以下消息:

以下Web应用程序已停止(重新加载,取消部署),但是它们 先前运行的类仍会加载到内存中,从而导致内存不足 泄漏(使用探查器进行确认):

这实际上给我造成了很大的问题,因为当我需要重新部署具有某些更改的应用程序时,旧版本仍保留在服务器中,而当我尝试使用它时,我会得到:

IllegalStateException: Illegal access: this web application instance has been stopped already

即使在tomcat / manager中,应用程序也显示为已启动。

我该如何解决?我看着here,但没有解决问题。我试着运行jps命令来获取pid的JVM,但由于权限问题,它不能返回JVM。

是否可以以某种方式配置tomcat,以便在取消部署应用程序时不应该在内存中保留该应用程序的任何类?

当我按照此处给出的步骤操作时,问题How to purge tomcat's cache when deploying a new .war file? Is there a config setting?不能解决我的问题:

  • 取消部署应用
  • 停止tomcat
  • 从tomcat的“ work”目录中删除该应用程序
  • 清除浏览器缓存
  • 启动tomcat
  • 将战争文件放入“ webapps”中
  • 稍等片刻
  • 启动应用

这些步骤不能解决问题

1 个答案:

答案 0 :(得分:0)

无法配置 tomcat来删除仍在引用的类。导致这种情况的一种简单方法(可能不是唯一的一种方法)是从Web应用程序启动线程,而在取消部署应用程序时不终止线程:对于tomcat,此线程不可用,但是对于JVM,正在运行的线程是不能被垃圾收集的类的有效根。

Tomcat会尽力检测并指示这种情况,但实际上不能违反JVM和垃圾收集器并丢弃仍被引用的完全有效的对象。

您执行的步骤(包括停止和启动tomcat)似乎是不可能的:终止JVM后,新启动的JVM引用旧类的唯一机会就是掌握它们。但是您还声明要删除工作目录(临时目录是什么?)。您还应该确保实际上删除的是正确的内容,而不是类似目录中其他服务器的内容。除此之外:似乎您只是缺少旧类所在的几乎显而易见的地方。一旦它们在重新启动时被接收,我上面描述的情况就可能出现。无法实现使Webapp表现良好并且无法在不终止它们的情况下启动随机后台线程的方法。

您可能要检查CATALINA_HOME和CATALINA_BASE是否不同,并可能提示使用相同名称部署的其他应用程序,以及在删除所描述的文件后是否启动了应用程序,然后启动(没有新的部署)