什么免费的JVM实现具有最好的PermGen处理?

时间:2009-06-17 19:21:36

标签: java jvm permgen

我正在Sun的JRE6中运行Tomcat6,并且每对夫妇都部署了OutOfMemoryException:PermGen。我已经完成了PermGen解决方案的谷歌搜索,并尝试了许多修复。没有工作。我读了很多关于Oracle的JRockit的好东西,以及它的PermGen分配大小如何(与Sun的128M相比)虽然它没有解决问题,但它允许我在PermGen异常之间重新部署100次而不是2现在。

JRockit的问题是在生产中使用它需要购买价值数千美元的WebLogic。还有哪些其他(免费)选项可以更宽容PermGen扩展?以下JVM如何在这个领域做什么?

  • IBM JVM
  • 打开JDK
  • Blackdown
  • Kaffe上

...别人?

更新:有些人问我为什么认为PermGen max是128M。原因是因为每当我尝试将其提升到128M以上时,我的JVM都无法初始化:

[2009-06-18 01:39:44] [info] Error occurred during initialization of VM [2009-06-18 01:39:44] [info] Could not reserve enough space for object heap [2009-06-18 01:39:44] [395 javajni.c] [error] CreateJavaVM Failed

奇怪的是它没有尝试为对象保留空间,尽管我不确定它是“堆”而不是“堆”。

我使用1024MB初始和1536MB最大堆启动JVM。

我会关闭这个问题,因为它已被回答,即。 “切换是无用的”,而是要求Why does my Sun JVM fail with larger PermGen settings?

7 个答案:

答案 0 :(得分:7)

我同意Michael Borgwardt的说法,你可以增加PermGen的大小,我不同意这主要是因为内存泄漏。 PermGen空间被大量使用Reflection的应用程序侵占。所以基本上如果你有一个在Tomcat中运行的Spring / Hibernate应用程序,那么就要准备好让PermGen空间大量增加。

答案 1 :(得分:5)

是什么让你认为Sun的JVM仅限于128M PermGen?您可以使用-XX:MaxPermSize命令行选项自由设置它;默认值为64M。

但是,问题的真正原因可能是应用程序中的内存泄漏,导致类无法收集垃圾;这些可能非常微妙,特别是当涉及ClassLoader时,因为所有需要的是对任何类的任何地方的单一引用。 This article详细描述了问题,this one提出了修复问题的方法。

答案 2 :(得分:3)

从技术上讲,“PermGen”内存池是Sun JVM的事情。其他JVM不会这样称呼它,但它们都有一个或多个非堆内存池的想法。

但是如果你的Sun JVM中存在permgen问题,那么迁移到另一个JVM是不太可能解决任何问题,它只会以不同的名称表现出来。

如果多次重新部署导致您的问题,只需将VM的PermGen提升到较大值即可。我们在一段时间之前尝试过JRockit因为这个问题,并且它遭受了相同的重新部署耗尽。我们搬回了SUn JVM。

答案 3 :(得分:3)

改变JVM并不是灵丹妙药。您可能会遇到新的意外问题(例如,请参阅an article有关在4种不同的JVM下启动应用程序的信息)。

  • 您可以在重新部署时发生类泄漏(例如通过类加载器)。坦率地说,我从未在Tomcat上看到过热重新部署(希望有一天能看到)。
  • 您可能有不正确的JVM参数(例如,对于Sun JDK 6 64位-XX:+ UseParNewGC开关导致泄漏PermGen内存段。如果添加其他开关:-XX:+ UseConcMarkSweepGC -XX:+ CMSClassUnloadingEnabled-XX: + CMSPermGenSweepingEnabled情况将得到解决。好笑,但我从来没有遇到过上面提到的Sun JDK 6 32位漏洞)。 Link一篇文章“调整生产部署的JVM垃圾收集”。
  • 您的PermGen块可能不足以加载类和相关信息(实际上,最经常发生在Tomcat下重新部署后,旧类保留在内存中并且新类正在加载)

根据我过去的经验,调试这种泄漏是我曾经遇到过的最棘手的调试之一。

<强> [增订]

Useful article如何在应用程序重新部署时消除类加载器链接。

答案 4 :(得分:0)

我使用JRockit,如果我没有提升(通过-XX:MaxPermSize)内存,我仍会得到PermGen错误。我也无法得到任何工作来避免这样做(除了增加它)。

答案 5 :(得分:0)

Perm gen可能是最容易处理的内存,我怀疑各种vm实现之间存在很大差异。

确保生产中标记为关闭的所有Tomcat配置都已关闭。

是的,有些框架确实可以生成很多类,但它们应该自行清理,而且,无论如何,你可以在128Mb中安装多个类。

说真的,如果perm gen继续上升那么应该修复泄漏问题,尽管修复它可能不是你的问题。

答案 6 :(得分:0)

IBM JVM没有(并且在2009年没有)有一个permgen。您可以阅读有关其Generational Concurrent Garbage Collector的更多信息,这是Java 7的默认GC。

我有时在IBM JVM上运行Eclipse IDE,因为使用我最喜欢的插件时,它会经常填满HotSpot JVM的permgen。当然,可能有人应该修复内存泄漏,但同时我的IDE没有崩溃,我并没有忙于尝试不同的设置。