2

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

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

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

4

3 回答 3

5

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

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

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

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

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

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

仅对一个对象的一次引用就足以导致 permgen 泄漏。如果可以是一个枚举值,一个尚未取消注册的侦听器,...

编辑

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

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

I don't know if there are specific issues with Hibernate, but any complicated framework is potentially susceptible to this kind of problem, either on its own or in combination with application code.

于 2010-10-11T14:30:58.177 回答
2

If you are running your application under linux, running your application with the IBM JRE will solve this issue.

于 2010-10-17T19:31:15.770 回答
0

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

于 2010-10-11T13:47:55.320 回答