簡體   English   中英

使用多個類加載器保存PermGen空間

[英]Saving PermGen space with several classloaders

我們在Scala中編寫了一個包含大量類的大型GUI應用程序,我們必須增加PermGen空間才能加載所有類。 應用程序本身顯示了一系列基於屏幕的活動,每個活動都加載了自己的大型類。 在任何時間點只加載/顯示一個活動。 經過幾個活動后,我們在PermGen空間中出現了OutOfMemoryError

我理解PermGen空間是垃圾收集的,就像堆的其余部分一樣 ,但是我很想知道是否可以減少每個活動一個ClassLoader所需的PermGen空間,以便允許類卸載。

所以:

  1. 我知道系統ClassLoader加載的類無法卸載,因為它們將永遠被類加載器引用。 真的嗎?
  2. 如果我的自定義類加載器不再加載類的實例,並且類加載器可以被垃圾收集,它的類是否會被卸載,釋放PermGen空間?
  3. 是否有任何關於(或常見錯誤會阻止)類卸載的警告?

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

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

你的PermGen有多大? 你可以通過以下方式與PermGen碰撞:

-XX:MaxPermGen=256m

在你的命令行上。 將其設置為512米並不罕見。 如果您想要一個真正強大的解決方案,您將需要按照“活動”使用自定義類加載器的路線。 為了幫助調試,還要在命令行中添加以下自解釋參數:

-XX:+TraceClassLoading

這將在JVM中將類加載到命令行時打印出類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM