2013-08-29 26 views
1

如果我在Java中創建一個靜態變量,它會自動進入堆中的perm gen空間嗎?似乎很明顯,答案是肯定的,但我無法在任何地方找到確認。 我知道靜態變量(也是字符串和枚舉)在JVM的生命中是活着的,所以它必須放在永久堆中。它是否正確?可以在線程之間共享靜態變量是否在堆上的永久gen空間上

+2

未來,請閱讀[本文](http://javaeesupportpatterns.blogspot.ca/2013/02/java-8-from-permgen-to-metaspace.html)。 –

+0

這取決於JVM的實現,它是如何顯而易見的? – rocketboy

+0

確保區分*變量*和變量是否爲引用變量,它指向的是哪個對象。爲了引用,對象將被分配到對象被分配的地方。至於靜態變量的存儲位置,它可能會分配在與Class對象的其餘部分相同的一般區域中。 (但是請注意,這可能實際上不在GCed堆中。) –

回答

0

JLS #17.4.1 Shared Variables

存儲器被稱爲共享存儲器或堆存儲器。

所有實例字段,靜態字段和數組元素都存儲在堆內存中。在本章中,我們使用術語變量來指代字段和數組元素。局部變量(第14.4節),形式方法參數(第8.4.1節)或異常處理程序參數永遠不會在線程之間共享,並且不受內存模型的影響。這裏

尼斯描述通過@Stephen:static allocation in java - heap, stack and permanent generation

2

的「PermGen的」的想法是完全依賴於實現和JVM中可以自由地處理了「物理」內存管理不過是有道理的them--他們甚至不需要提供垃圾收集!

PermGen只是一些JVM實現(包括Sun/Oracle HotSpot JVM多年)的一個特性,實際上它正在Oracle Java 8 JVM中採用新方法取消。包含PermGen概念的JVM很可能會將靜態變量放在那裏用於性能,但完全取決於程序員。