2011-10-14 15 views
6

我們在Scala中編寫了一個大型的GUI應用程序,並且有很多類,我們必須增加PermGen空間才能加載所有類。該應用程序本身顯示了一系列基於屏幕的活動,每個活動都加載了自己的大量類。在任何時候只有一個活動被加載/顯示。在經歷了幾次活動之後,我們在PermGen空間中有了一個OutOfMemoryError用幾個類加載器保存PermGen空間

據我所知,PermGen的空間是garbage collected just like the rest of the heap,但我很想看看是否可以通過減少PermGen空間所需的空間。每個活動一個ClassLoader以便允許班級卸載。

所以:

  1. 我明白,由系統類裝入器裝入類不能被卸載,因爲他們將永遠被他們的類加載器被引用。真的嗎?
  2. 如果不再有我的自定義類加載器加載的類的實例在附近,並且類加載器可以被垃圾收集,它的類將被卸載,釋放PermGen空間?
  3. 有沒有關於(或常見的錯誤會阻止)類卸載的警告?
+0

你的PermGen有多大? –

+0

128m太小,現在可以使用256m,但需要多長時間?... –

回答

6

...如果我可以通過使用例如減少PermGen空間所需的空間,每個活動一個 ClassLoader,以便允許類卸載。

是的,如果所使用的類加載器是垃圾收集,則唯一的方法是有資格卸載。這意味着對每個類和類加載器本身的引用都必須爲零。

您的PermGen有多大?您可能會因爲碰撞PermGen而逃脫:

-XX:MaxPermGen=256m 

在您的命令行上。將其設置爲512米並不罕見。如果你想要一個真正強大的解決方案,你需要走每條'活動'使用自定義類加載器的路線。爲幫助調試,下面的自我解釋參數添加到您的命令行,以及:

-XX:+TraceClassLoading 

,因爲它們是在JVM命令行加載這將打印出來的類。

+0

感謝您的回答。在Mac OS X上,我的JRE版本1.6.0_26上看起來像「-XX:+ TraceClassloading';任何更換? –

+0

-XX:+ TraceClassLoading –

+0

好的,這個工作,謝謝。我現在也使用'-XX:+ TraceClassUnloading'。 –