2009-06-17 43 views
7

我在Sun的JRE6中運行Tomcat6,每對情侶都部署OutOfMemoryException:PermGen。我已經完成了PermGen解決方案的Google搜索,並嘗試了許多修補程序。沒有工作。我讀了很多有關Oracle JRockit的好東西,以及它的PermGen分配如何在規模上演出(與Sun的128M相比),雖然它不能解決問題,但它允許我在PermGen異常之間重新部署100次,而不是2次現在的時間。什麼免費的JVM實現有最好的PermGen處理?

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

我同意Michael Borgwardt的意見,你可以增加PermGen的大小,我不同意這主要是由於內存泄漏。 PermGen空間被大量使用Reflection的應用程序積極搶佔。所以基本上,如果你有一個運行在Tomcat中的Spring/Hibernate應用程序,準備好將PermGen空間提升很多。

5

是什麼讓你認爲Sun的JVM限於128M PermGen?您可以使用-XX:MaxPermSize命令行選項自由設置它;默認是64M。

但是,問題的真正原因可能是應用程序中存在內存泄漏,導致類無法收集垃圾;這些可能非常微妙,特別是在涉及ClassLoaders時,因爲它只需要對任何類的單個引用進行引用。 This article詳細描述了該問題,並且this one提出瞭解決該問題的方法。

+0

我已經閱讀過那篇文章,但它並沒有提供任何實際上對某些不是一些愚蠢的小微示例有用的東西。 OP只需要習慣它,而不是浪費時間來解決它。 – GreenieMeanie 2009-06-17 19:58:14

+1

要麼你沒有閱讀第二篇文章,或者你還沒有理解它。 – 2009-06-17 22:10:01

+0

班級裝載機真的不那麼辛苦......但人們似乎被他們嚇倒了。 – CurtainDog 2010-04-15 01:01:57

3

從技術上講,「PermGen」內存池是一個Sun JVM的東西。其他JVM不會這麼稱呼它,但它們都有一個或多個非堆內存池的想法。

但是,如果Sun JVM中的permgen存在問題,移動到其他JVM不太可能解決任何問題,它只會以不同的名稱顯示自己。

如果多個重新部署導致您的問題,只需將虛擬機的PermGen提升到較大的值。由於這個問題,我們嘗試了JRockit,而且它也遭受同樣的重新部署耗盡。我們回到了SUn JVM。

+0

謝謝,這是我正在尋找的經驗。我原來看JRockit是因爲人們聲稱你可以將其相當於千兆字節的PermGen增加,至少允許在爆炸之間的時間跨度更長。 – rcampbell 2009-06-18 05:33:53

0

我使用JRockit,如果我沒有碰到(通過-XX:MaxPermSize)內存,我仍然得到PermGen錯誤。我也無法得到任何工作,以避免得到這個(除了增加它)。

+1

JRockit沒有配額空間,所以我不明白它如何使用-XX:MaxPermSize將它變得更好?如果您使用-XX:MaxPermSize運行JRockit,則會看到以下警告消息: [WARN] -XX:MaxPermSize不是有效的VM選項。忽略 您真的使用JRockit運行您的應用程序嗎?確切地說,是 – 2009-06-17 20:18:51

3

更改JVM不是萬能的。您可能會遇到新的意外問題(例如,參見an article關於在4個不同的JVM下啓動應用程序)。

  • 您可以在重新部署時發生大多數情況下經常發生的類泄漏(例如,通過類加載器)。坦率地說,我從來沒有見過工作熱的重新部署在Tomcat上(希望看到有一天)。
  • 如果你添加了額外的開關:-XX:+ UseConcMarkSweepGC -XX:+ CMSClassUnloadingEnabled-XX:你可以使用不正確的JVM參數(例如,對於Sun JDK 6 64位-XX:+ UseParNewGC開關導致泄漏PermGen內存段。 + CMSPermGenSweepingEnabled的情況將得到解決。有趣的是,我從來沒有遇到過上面提到的Sun JDK 6 32位的泄漏)。 Link轉化爲一篇文章「調整生產部署的JVM垃圾收集」。
  • 你的PermGen塊可以是不夠的,加載類和相關信息(實際上是最經常發生在Tomcat下重新部署後,老班留在記憶新的問題也加載)

根據我以往的經驗,調試那種泄漏是我曾經遇到的最棘手的調試之一。

[增訂]

Useful article如何消除上的應用程序重新部署類加載器鏈接。

0

Perm gen可能是最簡單的內存來處理,我懷疑各種虛擬機實現之間會有很大的區別。

確保在生產中關閉生產中標記爲關閉的所有Tomcat配置。

是的,有些框架確實會產生很多類,但它們應該自行清理,而且無論如何,你可以在128Mb中安裝多個類。

說真的,如果perm gen繼續上漲那麼這就是泄漏a應該是固定的,雖然它可能不是你的問題來解決。

0

IBM JVM沒有(也沒有在2009年)有一個permgen。您可以閱讀更多關於其默認GC for Java 012的Generational Concurrent Garbage Collector

我有時在IBM JVM上運行Eclipse IDE,因爲使用我最喜歡的插件,它經常會填充HotSpot JVM的permgen。當然,可能存在內存泄漏,應該有人修復,但同時我的IDE沒有崩潰,我沒有忙着嘗試不同的設置。

相關問題