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++之類比較那個好?
※想做軟體開發,學哪種語言比較好?
※聽說過面向工資編程嗎?面向工資編程是怎樣一種體驗?