標籤:

JVM 常量池中存儲的是對象還是引用呢?

最近在探究JVM常量池。隨著了解的深入,產生了一個疑問,常量池中存放的到底是引用還是對象呢?

如果是引用,我認為比較合理。

但如果是對象,因為常量池是處於Method Area(方法區)中的,而對象是需要存放在Heap(堆)中的,那常量池豈不是「越權」了?

網上也搜不到相關資料,特來請教大神。


如果您說的確實是runtime constant pool(而不是interned string pool / StringTable之類的其他東西)的話,其中的引用類型常量(例如CONSTANT_String、CONSTANT_Class、CONSTANT_MethodHandle、CONSTANT_MethodType之類)都存的是引用,實際的對象還是存在Java heap上的。


深入理解JVM虛擬機第二章


就是你想的那樣,存的引用。


JDK7,根據R大上面以及另一問題的耐心解答方法區的Class信息,又稱為永久代,是否屬於Java堆?,整理了一下:

PermGen是Java Heap的一個邏輯區、

Run-Time Constant Pool仍在PermGen、

StringTable本身在Native Memory(存的只是引用)、

Java 7 StringTable引用的實例從PermGen移到了普通Java heap。

然後,還是最無聊的new String問題,內存中會新建兩個對象巴拉巴拉。。。

void methodA() {

String str = new String(「abc」);

}

基於上面的總結,在下面畫了個草圖,錯誤還請指正。。。

疑惑頗多,還勞R大給我們菜鳥們費心講解:

1、」abc」到底放在」abc」-1還是」abc」-2?

2、當methodA執行完後,引用1移除,若發生GC,String(「abc」)將會被回收,」abc」(未知」abc」-1或」abc」-2)是否會被回收?

2.1 假如是」abc-1」,那就是普通的Java Heap,此時沒有地方引用,應該會被回收?

2.2 若不被移除的話,StringTable又有何必要存在,後面直接從Java Heap中就可判斷是否存在」abc」?

3、此時並沒有執行str.intern(),是否會將」abc」.ref添加到StringTable?是否只有str.intern()才會將字元串引用添加到StringTable?


推薦閱讀:

jvm內存回收詭異現象,求解?
JVM的JIT優化所帶來的性能提升與C++之類比較那個好?
想做軟體開發,學哪種語言比較好?
聽說過面向工資編程嗎?面向工資編程是怎樣一種體驗?

TAG:Java | HotSpotVM |