JDK1 8關於執行時常量池, 字串常量池的要點

2021-09-02 05:26:57 字數 767 閱讀 1471

網上關於jdk 1.8的各種實驗,  結論魚龍混雜 , 很多都相矛盾,網上有的實驗也被後人測試出了不同的結果

很多都分辨不了真假, 這裡記錄一下網路上正確的結論, 歡迎指正!

首先自行區分執行時常量池class檔案常量池(靜態常量池)的概念, jvm記憶體模型 ,方法區與永久代的區別, 有些在我的其他部落格有介紹,  連線在文尾

jdk1.7之前執行時常量池邏輯包含字串常量池存放在方法區, 此時hotspot虛擬機器對方法區的實現為永久代

jdk1.7字串常量池被從方法區拿到了堆中, 這裡沒有提到執行時常量池,也就是說字串常量池被單獨拿到堆,執行時常量池剩下的東西還在方法區, 也就是hotspot中的永久代

jdk1.8hotspot移除了永久代元空間(metaspace)取而代之, 這時候字串常量池還在堆,執行時常量池還在方法區, 只不過方法區的實現從永久代變成了元空間(metaspace) 

永久代->元空間  

string.intern   

jvm記憶體空間模型  

JVM 常量池 執行時常量池 字串常量池的理解

補充 答 常量池有class檔案的常量池 在檔案中 執行時常量池 記憶體中,由class檔案常量池得來 字串常量池是大的全域性字串快取池,公用。問 是的,那我這裡有點疑惑,就是這個helloword在編譯期的時候,是存於class的常量池中的,在class被載入後,存於記憶體中的執行時常量池,那麼,...

關於字串常量池的理解

1.記憶體區域 在棧中存放的是基本資料型別和引用資料型別 在堆中放的是物件的例項 在方法區中有一塊位址是常量池,常量池中用於存放字串常量 2.建立字串物件的兩種方式 string str1 hello string str2 hello string str3 newstring hello str...

jvm字串常量池的理解

先看乙個例子stringdemo2 public class stringdemo2 執行結果 false true 詳解 1.首先,通過main 方法進棧。2.然後再棧中定義乙個物件s1,去堆中開闢乙個記憶體空間,將記憶體空間的引用賦值給s1,hello 是常量,然後去字串常量池 檢視是否有hel...