【问题标题】:Is it still impossible to get rid of out of PermgenSpace exceptions when redeploying?重新部署时是否仍然无法摆脱 PermgenSpace 异常?
【发布时间】:2010-10-11 13:09:00
【问题描述】:

这是我一直遇到的老问题。我想在开发环境中重新部署。在一些部署之后,我用完了 permgen 并且不得不终止服务器。多年前,我试图找到解决问题的方法,但发现 Spring 和 Hibernate 互相指责该问题。有没有找到解决办法?

Spring Roo 声称它不会在运行时生成类,因此不会有问题。它真的有效吗?如果有效,我该如何配置我的应用程序?

我知道这里有两个问题,但如果你能回答一个就足够了:)

【问题讨论】:

  • 只是增加服务器的永久空间
  • 是的,这一直是我不满意的“解决方案”。它不能解决问题。

标签: java jvm permgen


【解决方案1】:

据我了解,典型的 PermGen 存储泄漏是这样的。

  1. 某个对象的类已被热部署替换的对象的可访问引用。

  2. 该对象具有对其类描述符的引用。

  3. 类描述符有一个对其 ClassLoader 的引用。

  4. ClassLoader 引用了它已加载的所有类的类描述符。

  5. 每个类描述符都有对类静态框架、其字节码、本机代码等的引用。

仅对一个对象的一次引用就足以导致 permgen 泄漏。如果可以是一个枚举值,一个没有被注销的监听器,...

编辑

遇到此问题的人通常采取的做法是耸耸肩并增加 PermGen 堆大小。如果您确实需要为您的 Web 应用程序解决问题,那么:

  • 查看您的 web 应用关闭的方式,确保数据库连接/连接池已关闭,所有回调均未注册等。
  • 使用 Java 内存分析器来跟踪由重新部署触发的 PermGen(和其他)内存泄漏。
  • 如果随着 Web 应用的发展而引入新的泄漏,请准备好重复该过程。

我不知道 Hibernate 是否存在特定问题,但任何复杂的框架都可能容易受到此类问题的影响,无论是单独使用还是与应用程序代码结合使用。

【讨论】:

  • 您知道在使用 Hibernate 时是否总是发生这种情况,还是我可能犯了一个错误?有没有办法检测这种泄漏?
【解决方案2】:

如果您在 linux 下运行应用程序,使用 IBM JRE 运行应用程序将解决此问题。

【讨论】:

【解决方案3】:

有几件事可以帮助解决这个问题。 Spring 有一个“IntrospectionCleanupListener”可以提供一点帮助。如果您在 Web 应用程序中加载和创建 JDBC 连接,您可以拥有一个 servlet 上下文侦听器,它将取消注册您在应用程序中加载的驱动程序。这些有帮助,但不能完全解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2014-05-08
    • 2023-04-05
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2013-02-20
    相关资源
    最近更新 更多