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

sti*_*ows 7 java tomcat server

tomcat/manager当我点击find leaks按钮,我得到以下信息:

以下 Web 应用程序已停止(重新加载、取消部署),但它们之前运行的类仍在内存中加载,从而导致内存泄漏(使用分析器确认):

这实际上给我带来了很大的问题,因为当我需要重新部署应用程序并进行一些更改时,旧版本保留在服务器中,当我尝试使用它时,我得到:

IllegalStateException: Illegal access: this web application instance has been stopped already
Run Code Online (Sandbox Code Playgroud)

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

我该如何解决?我看了here但没有解决问题。我尝试运行jps命令来获取pidJVM,但它没有返回 JVM,我猜是由于许可问题。

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

问题如何在部署新的 .war 文件时清除 tomcat 的缓存?有配置设置吗?没有解决我的问题,因为我按照那里给出的步骤操作:

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

这些步骤没有解决问题

Ola*_*ock 0

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

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

您给出的步骤(包括停止和启动 tomcat)似乎是不可能的:一旦您终止 JVM,新启动的 JVM 引用旧类的唯一机会就是它获取它们。但您还声明要删除工作目录(临时目录呢?)。您还应该确保您实际上删除的是正确的内容,而不是类似目录中其他服务器的内容。除此之外:看来您只是错过了旧课程所在的几乎明显的地方。一旦它们在重新启动时被拾取,我上面描述的情况可能会出现。没有办法让 web 应用程序表现良好,并且在不终止它们的情况下不启动随机后台线程。

您可能想要检查 CATALINA_HOME 和 CATALINA_BASE 是否不同,并且可能会给出有关以相同名称部署的其他应用程序的提示,并且如果您的应用程序在您删除所描述的文件时启动,则启动(无需新部署)