[英]Significance of PermGen Space
PermGen空間在java中有什么意義?
PermGen空間保留給長期對象 - 主要是由ClassLoader
加載的Class
對象。 PermGen不會被垃圾收集,除非在非常特殊的情況下(特別是當加載這些類的ClassLoader
超出范圍時)。
這是一個垃圾收集優化 - 如果我們不希望被垃圾收集的對象被單獨存儲,它會壓縮存儲其余對象的空間,這導致垃圾收集器的工作量減少。
PermGen特定於具有世代垃圾收集的VM。
如果你使用JRockit,那么“PermGen的意義”就不存在了,因為JRockit沒有這個概念。
幾年前,當奇怪的“出於PermGen空間”錯誤開始出現並且沒有人知道它的錯誤(Tomcat + Hibernate + Sun VM用來觸發它)來替換其中一個組件時,它常見(現在問題已被理解,但幾年前當他們開始裁剪時,很難找到任何有關此問題的信息)。 你可以用Resin替換Tomcat或用JRockIt替換Sun VM等。
我認為重要的是要指出PermGen不是Java規范的一部分,只是(相當)一些VM的實現細節。
您真正需要知道的唯一事情是PermGen空間與常規堆分開,並且不受-Xmx
VM參數的影響。 如果您的應用程序加載了許多類定義(如應用程序服務器或IDE),則可以使用-XX:MaxPermSize
VM選項設置PermGen空間大小。
永久代包含描述用戶類的元數據(不屬於Java語言的類)。
具有大型代碼庫的應用程序可以填滿堆的這一部分,這將導致java.lang.OutOfMemoryError: PermGen
。 這不受-Xmx設置或機器上有多少內存的影響。 要設置新的初始大小,請使用-XX:PermSize=64m
。 要設置最大大小,請使用-XX:MaxPermSize=128m
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.