1. 程式人生 > >jvm 執行時資料區、String 常量池

jvm 執行時資料區、String 常量池

私有 
- 程式計數器:記錄當前執行緒所執行位元組碼的行號指示器 

- 虛擬機器棧:存放了當前執行緒呼叫方法的區域性變量表、運算元棧、動態連結、方法返回值等資訊(可以理解為執行緒
的棧) 

- 本地方法棧:為虛擬機器使用的Native方法提供服務

共享 
- Java堆:佔據了虛擬機器管理記憶體中最大的一塊,唯一目的就是存放物件例項,也是垃圾回收器主要管理的地方,故又稱GC堆

- 方法區:儲存載入的類資訊、常量區、靜態變數、JIT(即時編譯器)處理後的資料等,類的資訊包含類的版
本、欄位、方法、介面等資訊。需要注意是常量池就在方法區中,也是我們這次需要關注的地方

String常量池隨JDK的改變

JDK1.7中JVM把String常量區從方法區中移除了;JDK1.8中JVM把String常量池移入了堆中,同時取消了“永久
代”,改用元空間代替(Metaspace)

String.intern()

檢查字串常量池中是否存在String,如果存在返回池裡的字串引用;若池中不存在,則將其加入池中,並返回其引用。 

這樣做主要是為了避免在堆中不斷地建立新的字串物件

對於直接做+運算的兩個字串(字面量)常量,並不會放入String常量池中,而是直接把運算後的結果放入常
量池中

對於先宣告的字串字面量常量,會放入常量池,但是若使用字面量的引用進行運算就不會把運算後的結果放入常量池中了

JVM會對String常量的運算進行優化:未宣告的,只放結果;已經宣告的,只放宣告

這裡寫圖片描述