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

Rob*_*ell 7 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.

我会关闭这个问题,因为它已被回答,即."切换是无用的",而是问为什么我的Sun JVM会因为更大的PermGen设置失败?

Tha*_*Don 7

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


Mic*_*rdt 5

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

但是,问题的真正原因可能是应用程序中的内存泄漏,导致类无法收集垃圾; 这些可能非常微妙,特别是当涉及ClassLoader时,因为所有需要的是对任何类的任何地方的单一引用.本文详细介绍了这个问题,这个建议如何解决它.