string abc = new String("abc")
阿新 • • 發佈:2021-11-24
執行時建立了幾個變數?
當常量池中存在該變數時,建立一個,即直接在堆記憶體空間建立
當常量池中不存在該變數時,即在常量池空間建立一個,之後在堆記憶體空間建立一個
為什麼會建立一個常量池,為什麼字串不像其它物件那樣儲存在堆記憶體中?
1.所有的字串字面量都被儲存在一個稱為字串常量池
2.通常,在一個 Java 業務應用程式會建立並處理成千上萬個字串物件,這些字串物件中有許多具有相同的值或者是中間操作字元而非最終結果。如果我們將所有這些字串物件儲存在堆記憶體中,僅僅是儲存這些字串物件就需要佔用大量的堆記憶體 .
3.為了避免 ,JVM 首先建立大量的字串物件,然後再進行垃圾回收。 JVM 將所有字串字面量儲存在稱為字串常量池的單獨記憶體區域中,並重用該快取記憶體池中的物件
JVM執行時候記憶體模型
一個.java是怎麼執行的
1.javac編譯成class檔案
2.之後的操作交給JVM
JVM中
方法區:存放的是被載入的class檔案相關資訊,
堆:當程式執行時,JVM虛擬機器會把程式執行時建立的結果放在堆中
PC暫存器:主要用來儲存執行緒,當建立新的執行緒時.該執行緒得到的一個是自己的PC暫存器,一個java棧
本地方法區:存本地的非Java方法,由執行引擎負責呼叫
棧區:用來儲存值型別的,如基本資料型別,String是引用資料型別,是儲存在堆中,java棧是由很多棧幀組成的,一個棧幀中包含有java方法呼叫狀態,當執行緒呼叫一個方法時,虛擬機器壓入一個新的棧幀到該執行緒的java棧
**[``]()**