jvm中例項(引用),物件儲存位置
一個完整的Java程式執行過程會涉及以下記憶體區域:
1、暫存器:
JVM內部虛擬暫存器,存取速度非常快,程式不可控制。
2、棧:
儲存區域性變數的值,包括:1.用來儲存基本資料型別的值;2.儲存類的例項,即堆區物件的引用(指標)。也可以用來儲存載入方法時的幀。
3、堆:
用來存放動態產生的資料,比如new出來的物件。注意創建出來的物件只包含屬於各自的成員變數,並不包括成員方法。因為同一個類的物件擁有各自的成員變數,儲存在各自的堆中,但是他們共享該類的方法,並不是每建立一個物件就把成員方法複製一次。
4、常量池:
JVM為每個已載入的型別維護一個常量池,常量池就是這個型別用到的常量的一個有序集合。包括直接常量(基本型別,String)和對其他型別、方法、欄位的符號引用。池中的資料和陣列一樣通過索引訪問。由於常量池包含了一個型別所有的對其他型別、方法、欄位的符號引用,所以常量池在Java的動態連結中起了核心作用。常量池存在於堆中。
5、程式碼段:
用來存放從硬碟上讀取的源程式程式碼。
6、資料段:
用來存放static定義的靜態成員。
對於區域性變數,如果是基本型別,會把值直接儲存在棧;如果是引用型別,比如String s = new String(“william”);會把其物件儲存在堆,而把這個物件的引用(指標)儲存在棧。
再如
String s1 = new String(“william”);
String s2 = s1;
s1和s2同為這個字串物件的例項,但是物件只有一個,儲存在堆,而這兩個引用儲存在棧中。
類的成員變數在不同物件中各不相同,都有自己的儲存空間(成員變數在堆中的物件中),基本型別和引用型別的成員變數都在這個物件的空間中,作為一個整體儲存在堆。而類的方法卻是該類的所有物件共享的,只有一套,物件使用方法的時候方法才被壓入棧,方法不使用則不佔用記憶體。
7、記憶體中的執行過程