2012-06-27 11 views
2

我有一個swing應用程序,當我在Windows上運行它我沒有問題,但是當我在linux上運行它時出現內存不足permgen異常幾次後我使用它。java permgen內存不足在Linux上的swing應用程序,但不是在windows上

在Windows上我使用JDK6更新32位32位,在Linux上我使用相同的JDK 6,相同的更新版本,但64位。

當我在windows/linux上運行應用程序時,唯一改變的是外觀和感覺,當我在Windows上運行它時,我使用其中一個,當我在linux上運行它時,我使用另一個,但它們都來自jgoodies站點。

這是什麼原因造成這個問題?

感謝您的幫助

+0

出於興趣,你是否調整內存分配?還是他們保持默認? –

+0

我知道我可以增加permgen空間,但是我將它作爲默認運行,因爲我在Windows上運行它,唯一增加的是帶有-Xmx512m的堆空間 – res1

+2

我認爲在增加堆時,必須增加Permgen大小空間。考慮這個來源。 http://mark.koli.ch/2009/01/understanding-javas-perm-gen-maxpermsize-heap-space-etc.html – javaCity

回答

3

當你認爲這是一個Windows與Linux的比較的東西,我覺得這兩個系統之間的更加突出的差別是32位與64位。

在64位JVM上,引用和引用值字段佔用兩倍的字節數,而在其他情況下,填充值增加。由於一個String對象包含一個引用字段等,這可能足以使對象變大。如果您有大量的字符串文字或手動插入的字符串,那麼可能會導致更高的PermGen用法。

無論哪種方式,顯而易見的解決方案是通過JVM命令行選項增加Permgen大小。事實上,除了想辦法減少應用程序的Permgen使用(這可能是不切實際的),這可能是唯一的解決方案。

+0

我明白你的觀點,我不是內存管理專家,但這不會影響堆空間嗎? – res1

+0

通過「這個」,我認爲你的意思是32 vs 64位?如果是這樣,那麼答案是,堆管理幾乎是差異的限制...除非你有本地代碼庫來抗衡。在源代碼中,線程和內存模型可能會有細微的差別,但是如果你的代碼是正確的,那麼它們不應該影響你。 –

相關問題