21

看起来像

 MemoryError: PermGen space
 java.lang.OutOfMemoryError: PermGen space

是一个常见的问题。您可以增加 perm 空间的大小,但在 100 或 200 次重新部署后它将被填满。跟踪 ClassLoader 内存泄漏几乎是不可能的。

您在生产服务器上使用 Tomcat(或另一个简单的 servlet 容器 - Jetty?)的方法是什么?每次部署解决方案后是否重新启动服务器?

您是否将一个 Tomcat 用于多个应用程序?

也许我应该在不同的端口(或嵌入式 Jetty)上使用许多 Jetty 服务器,并且每次都取消部署/重新启动/部署?

4

7 回答 7

6

我放弃了使用 tomcat 管理器,现在总是关闭 tomcat 重新部署。

我们在同一台服务器上运行两个 tomcat,并使用带有 mod_proxy_ajp 的 apache webserver,因此用户可以通过同一个端口 80 访问这两个应用程序。这也很好,因为当 tomcat 关闭时,用户会看到 apache Service Unavailable 页面。

于 2010-08-19T22:16:21.227 回答
3

您可以尝试添加这些 Java 选项:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

这将启用 PermGen 空间中的垃圾收集(默认关闭)并允许 GC 卸载类。此外,您应该使用其他地方提到的 -XX:PermSize=64m -XX:MaxPermSize=128m 来增加可用 PermGen 的数量。

于 2010-08-22T11:04:26.570 回答
2

是的,确实,这是一个问题。我们在 Tomcat 服务器上运行三个 Web 应用程序:第 1 个使用 Web 应用程序框架、Hibernate 和许多其他 JAR,第 1 个使用 Web 应用程序框架。2 使用 Hibernate 和一些 JAR 并且没有。3 基本上是一个非常简单的JSP 应用程序。

当我们部署没有。1、我们总是重启Tomcat。否则 PermGen 空间错误很快就会给我们带来麻烦。2 号有时可以毫无问题地部署,但因为它经常在没有时发生变化。1 也一样,无论如何都会安排重启。3号完全没有问题,可以根据需要随时部署而不会出现问题。

所以,是的,我们通常重启Tomcat。但我们也期待 Tomcat 7,它应该能够处理许多嵌入到不同第三方 JAR 和框架中的内存/类加载器问题。

于 2010-08-19T12:27:11.940 回答
2

HotSpot 中的 PermGen 切换只会延迟问题,最终你还是会得到 OutOfMemoryError。

我们已经有这个问题很长时间了,到目前为止我发现的唯一解决方案是使用 JRockit。它没有 PermGen,所以问题就消失了。我们现在正在我们的测试服务器上对其进行评估,自从切换以来我们还没有遇到过 PermGen 问题。我还尝试在我的本地机器上重新部署超过 20 次,使用的应用程序在第一次重新部署时出现此错误,并且一切顺利进行。

JRockit 旨在被集成到 OpenJDK 中,所以将来这个问题可能会在 Java 中消失。

http://www.oracle.com/technetwork/middleware/jrockit/overview/index.html

它是免费的,与 HotSpot 相同的许可证:

https://blogs.oracle.com/henrik/entry/jrockit_is_now_free_and

于 2012-02-21T20:03:34.277 回答
1

仅供参考,有一个新版本的Plumbr工具,它也可以监控和检测永久代泄漏。

于 2012-07-17T08:57:46.207 回答
1

您使用的是哪个版本的 Tomcat?Tomcat 7 和 6.0.30 有许多特性可以避免这些泄漏,或者至少会警告您它们的原因。

SpringSource 的 Mark Thomas(和长期的 Tomcat 提交者)关于这个主题的演讲非常有趣。

于 2012-04-24T20:29:20.433 回答
1

您应该启用 PermGen 垃圾回收。默认情况下,Hotspot VM 不会收集 PermGen 垃圾,这意味着所有加载的类文件都永远保留在内存中。每个新部署都会加载一组新的类文件,这意味着您最终会用完 PermGen 空间。

于 2010-12-10T12:25:36.083 回答