2013-03-20 51 views
0

我們有一個應用程序可以在垃圾收集之前生成數千個Java ClassLoaders和classes。我們確信沒有類加載器泄漏,但是我們正在獲得permgen錯誤(即使存在,這個問題也與任何潛在泄漏正交)。將Java ClassLoaders添加到堆而不是perm gen

有沒有什麼方法可以指定某些ClassLoaders及其加載的類放在堆中而不是放在perm gen中?

我們在Linux上使用Oracle JDK Java 6。


編輯:看起來像Java 8將不再有PermGen。它將被Metaspace取代。

http://java.dzone.com/articles/java-8-permgen-metaspace

回答

2

當然你要燙髮根的錯誤 - 這就是類加載器把班。你會期待什麼?

您可以將它們映射到字節緩衝區中,就像Java NIO一樣,但它們不會堆積在堆上。

在採取非常措施之前,你應該嘗試增加你的燙髮代碼。你需要多少燙髮空間?使用Visual VM進行配置文件並查看。

+0

謝謝。 「當然,你會遇到燙髮的錯誤 - 這就是班級裝載員上課的地方,你期望什麼?」我知道這一點,這就是我問這個問題的原因。如果這些對象可以放在常規內存中,那麼我們不會得到permgen錯誤(我們可能會遇到堆錯誤,這可能有助於解決我們的問題)。我們目前使用了385M的PermGen,我不認爲增加更多是個好主意。正如我所說的,可能會有泄漏,我們花了幾天的時間使用Visual VM和YourKit來尋找它。事情可能會更容易追查,如果我們有堆錯誤,而不是permgen。 – 2013-03-20 22:57:31

+0

不是。內存是內存 - 分代傳統是GC /內存模型設計的選擇。爲什麼增加它不是一個好主意?如果你有堆錯誤,增加堆是否也是一個壞主意?這整個方法是錯誤的。 – duffymo 2013-03-21 00:05:44

1

有什麼方法可以指定某些ClassLoaders及其加載的類放在堆中而不是放在perm gen中嗎?

AFAIK,沒有辦法做到這一點。 AFAIK,permgen分配發生在JVM運行時深處,你無法得到它。 (我認爲classloader本身並不存在於permgen中,我認爲這只是JVM的內部數據結構,它們代表了類和它們的代碼。)

如果你的應用程序真的需要這樣工作,認爲你別無選擇,只能讓permgen足夠大。 (很明顯,你應該檢查,真正的問題不是PermGen的泄漏。)

然而,這讓我感到你的應用程序的體系結構是相當奇怪的,如果它需要產生大量的類和類加載器。我希望看看它在做什麼不能以另一種方式完成。

+0

是的,應用程序的架構很奇怪。我很樂意將結構調整爲一種不同的方式,但這對於需要運行數百個創建,編譯,運行和銷燬Grails項目的測試的grails-ide來說很重要。 Grails使用Groovy,Groovy使用自定義類加載器來加載和編譯腳本。感謝您的建議。我們會繼續尋找。 – 2013-03-20 23:36:42

+0

聽起來好像是時候轉儲Grails了。我不知道這是不好的。感謝您的高舉。 – duffymo 2013-03-21 00:06:28

+0

該評論可能出錯了。從用戶的角度來看,Grails運行良好。當您運行grails命令並退出時,用於編譯的自定義類加載器很有意義。我們現在遇到的問題是我們的IDE測試套件中存在permgen問題,因爲我們需要在同一個進程中執行數百個命令。 – 2013-03-21 03:43:24

相關問題