我正在Sun的JRE6中运行Tomcat6,并且每对夫妇都部署了OutOfMemoryException:PermGen。我已经完成了PermGen解决方案的谷歌搜索,并尝试了许多修复。没有工作。我读了很多关于Oracle的JRockit的好东西,以及它的PermGen分配大小如何(与Sun的128M相比)虽然它没有解决问题,但它允许我在PermGen异常之间重新部署100次而不是2现在。
JRockit的问题是在生产中使用它需要购买价值数千美元的WebLogic。还有哪些其他(免费)选项可以更宽容PermGen扩展?以下JVM如何在这个领域做什么?
...别人?
更新:有些人问我为什么认为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?
答案 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下启动应用程序的信息)。
根据我过去的经验,调试这种泄漏是我曾经遇到过的最棘手的调试之一。
<强> [增订] 强>
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没有崩溃,我并没有忙于尝试不同的设置。