- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在 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 删除仍然被引用的类。导致这种情况的一种简单方法(可能不是唯一的方法)是从您的 Web 应用程序启动一个线程,而不是在应用程序未部署时终止它:对于 tomcat,该线程随后不可用,但对于 JVM,正在运行的线程是一个不能被垃圾回收的类的有效根。
Tomcat 尽最大努力检测和指示这种情况,但确实不能违背 JVM 和垃圾收集器并丢弃仍然被引用的完全有效的对象。
你给出的步骤,包括停止和启动 tomcat,似乎是不可能的:一旦你终止了 JVM,新启动的 JVM 引用旧类的唯一机会就是它获取它们。但是您还声明您正在删除工作目录(临时目录呢?)。您还应该确保您实际上是在删除正确的内容,而不是相似目录中其他服务器的内容。除此之外:您似乎只是错过了旧类(class)所在的几乎显而易见的地方。一旦它们在重启时被拾起,我上面描述的情况可能会开始。没有办法让 webapp 表现得很好并且不启动随机后台线程而不终止它们。
您可能想检查 CATALINA_HOME 和 CATALINA_BASE 是否不同,并且可能会提示以相同名称部署的其他应用程序,如果您的应用程序在您删除您描述的文件时启动,然后启动(没有新部署)
关于java - 如何配置tomcat,以便以前运行的类不会保留在内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52294766/
我是 firebase 的新手,我正在尝试分页查询。我喜欢有一个“下一个”和“上一个”按钮。我的下一个按钮工作正常,我的问题是单击上一个 引用:https://firebase.google.com/
抱歉,标题这么蹩脚,但我只是不知道该放什么,希望你能理解。另外,我不知道以前是否有人问过类似的问题,因为我不知道合适的关键字 - 因此也无法用谷歌搜索。 基本上...在查看preg_match_all
我想在 TFS 中 check out 一个检入文件的先前版本。我可以轻松获得特定文件的变更集 ID 列表,但无法弄清楚如何 checkout 以前的版本。 我目前的代码: var workspace
我想使用 @FunctionalInterface来 self 代码中的 Java 8,但我希望能够将生成的类文件与 Java 6 一起使用。我认为我应该将源版本设为 1.8 , 目标版本为 1.6
自从 versions 被删除以来,我一直无法找到安装以前版本软件的方法。命令并点击 Homebrew。我在 2008 Mac Pro (3,1) 上运行 macOS 10.14.3 (Mojave)
当我开始当前的项目时,App Store 中已经有一个应用程序。此应用程序仅适用于 iPhone。 我的第一个任务是测试和构建一个也可以在 iPod Touch 上运行的版本。 大约 3 周前,App
我在 GitHub 上有一个曾经是 fork 的 repo,但现在不是了,因为我已经删除了原始项目的任何痕迹并开始了一个同名的新项目。 但是,GitHub 仍然表示该项目是 fork 的。有什么方法可
我是一名优秀的程序员,十分优秀!