2009-10-27 197 views
59

我正在閱讀Java Memory Management中的文檔,並且遇到了我無法理解的PermSize。該文件說它存儲「JVM存儲其元數據」,但我無法準確獲取元數據的含義。我是谷歌搜索和我讀的地方存儲一個值對象(用戶定義的對象)。什麼是Java中的'PermSize'?

這裏存儲了什麼樣的對象?一個解釋的例子會很棒。

+0

64位虛擬機的缺省值爲64m。我們將它增加到運行8軌應用程序的tomcat服務器的「512m」。'-XX:MaxPermSize = 512m -XX:PermSize = 512m'。帶有許多類定義的Tomcat本身需要一個大的PerSize,並且使用ruby,ruby和jruby結合使用......需要一個巨大的PermSize。 –

+2

請注意,Permanent Generation(及其PermSize參數)將在Java 8中消失。它們被「Metaspace」替換。請參閱http://javaeesupportpatterns.blogspot.co.uk/2013/02/java-8-from-permgen-to-metaspace.html – sleske

回答

100

「永久代」的快速定義:

「的永久代用於 容納諸如類對象和方法 對象VM本身 的反射數據,這些反射對象是 。直接分配到永久 世代,並且它的大小爲 獨立於其他世代 。「 [ref]

換句話說,這就是類定義去(這就是爲什麼如果一個應用程序加載了大量的類和/或重新部署您可能會收到消息OutOfMemoryError: PermGen space)。

注意PermSize是另外通過在JVM上選擇用戶設置的-Xmx值。但是MaxPermSize允許JVM能夠將PermSize增長到指定的數量。最初加載虛擬機時,仍然是默認值(-client爲32mb,-server爲64mb),但實際上在需要之前不會佔用該數量。在另一方面,如果你設置這兩個PermSizeMaxPermSize爲256MB,你會發現,整體堆增加了額外的256MB的-Xmx設置。

9

永久存儲池包含所有不是您的應用程序數據的東西,而是虛擬機所需要的東西:通常它包含實例化字符串,定義類的字節代碼以及其他「不是您的」數據片段。

22

This blog post給出了一個很好的解釋和一些背景。基本上,「永久代」(其大小由PermSize給出)用於存儲JVM必須分配空間的內容,但通常不會被垃圾回收(因此爲「永久」)(+)。這意味着例如加載類和靜態字段。

還有一個直接來自Sun的FAQ on garbage collection,它回答了關於永久代的一些問題。最後,這裏有一個blog post,有很多技術細節。

(+)其實部分永久代進行GC化,例如,當一個類被卸載時,類對象將被刪除。但是當永久代被引入到JVM中時,這種情況並不常見,因此得名。