gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:46:19 26 4
gpt4 key购买 nike

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

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

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

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

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

我该如何解决这个问题?我看了here但没有解决问题。我尝试运行 jps 命令来获取 JVM 的 pid 但它没有返回 JVM,我猜是由于权限问题。

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

问题How to purge tomcat's cache when deploying a new .war file? Is there a config setting?没有解决我的问题,因为我按照那里给出的步骤操作:

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

这些步骤没有解决问题

最佳答案

没有办法配置 tomcat 删除仍然被引用的类。导致这种情况的一种简单方法(可能不是唯一的方法)是从您的 Web 应用程序启动一个线程,而不是在应用程序未部署时终止它:对于 tomcat,该线程随后不可用,但对于 JVM,正在运行的线程是一个不能被垃圾回收的类的有效根。

Tomcat 尽最大努力检测和指示这种情况,但确实不能违背 JVM 和垃圾收集器并丢弃仍然被引用的完全有效的对象。

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

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

关于java - 如何配置tomcat,以便以前运行的类不会保留在内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52294766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com