gpt4 book ai didi

java - 重新部署我的应用程序时出现 OutOfMemoryError

转载 作者:行者123 更新时间:2023-11-28 22:34:03 25 4
gpt4 key购买 nike

我正在开发一个具有插件加载机制的网络应用程序。这些插件位于单独的 jar 文件中,并为每个文件加载单独的 URLClassLoader。当我多次重新部署我的应用程序时,有时会收到 OutOfMemoryError

我读到这是因为 URLClassLoader 不能被垃圾回收,因为对它们加载的类的引用仍然存在。

如何在重新部署应用程序时释放此引用?

该应用在开发中运行在 Jetty 上,在生产中运行在 Tomcat 上。 Tomcat 还通知我有关此内存泄漏的信息。

最佳答案

你的插件加载机制的代码在哪里?它是在 TOMCAT_HOME/lib 中的 jar 文件中还是在您的 WAR 存档中?

如果您的所有类都在您的 WAR 存档中,则泄漏肯定与 tomcats 类加载机制的行为有关。

每次您(重新)部署应用程序时,Tomcat 都会创建一个 WebappClassLoader 的新实例。在停止或重新部署相应的应用程序后,每个 WebappClassLoader 实例都应该有资格进行垃圾回收。在典型的内存泄漏的情况下,WebappClassLoaders 不能被垃圾回收,因为对仍然存在的 WebappClassLoader 的强引用。为了修复此类泄漏,您必须手动删除强引用。

您可以按照以下简单步骤找到泄漏:

  • 启动您的服务器并部署您的应用
  • 取消部署您的应用程序(使用 tomcat 管理器)
  • 创建堆转储并使用 Eclipse MAT 打开它
  • 找到从您的 WebappClassLoader 到 GC 根的引用路径(排除弱引用和软引用!)
  • 现在您应该看到防止 WebappClassLoader 被垃圾回收的强引用。

有关更多信息,请在此处发布 eclipse MAT 的屏幕截图。

关于java - 重新部署我的应用程序时出现 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24363735/

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