1. 程式人生 > >JVM 堆疊區域資料存放流程

JVM 堆疊區域資料存放流程

Java程式執行過程中,JVM定義了各種區域用於儲存執行時資料。其中的有些資料區域在JVM啟動時建立,並只在JVM退出時銷燬。其它的資料區域與每個執行緒相關。這些資料區域,線上程建立時建立,線上程退出時銷燬。

JVM 由3部分組成:

棧區

---------------------------------

基礎資料型別 byte short int long float double char boolean
方法的形式引數,方法呼叫完後從棧空間回收
引用物件的地址,引用完後,棧空間地址立即被回收,堆空間等待GC
棧內的資料執行緒之間獨立
具體劃分為:基本型別變數區、執行環境上下文、操作指令區

堆區
---------------------------------

this
new 出來的物件
陣列
jvm只有一個堆區,並被所有執行緒共享

方法區(又叫靜態區和永久區)

---------------------------------

字串常量
static
所有class
被所有執行緒共享, 其記憶體放程式中永遠唯一的元素

案例分析:

public class AppMain {// 執行時 jvm把類資訊加入方法區

	/**
	 * @param args
	 */
	public static void main(String[] args) {// main方法放入方法區

		Sample test1 = new Sample("hello"); // test1是引用 放入棧中 new Sample("hello")物件放入堆中
		test1.printName();
		
	}

}


class Sample { // 執行時 jvm把 類資訊放入方法區
	
	private String name; // new Sample()後, name 引用放入棧  name物件放入堆
	
	public Sample(String name){
		this.name = name;
	}
	
	public void printName(){ // 方法本身放入方法區
		System.out.println(name);
	}
}


執行分析說明:

Sample test1 = new Sample("hello"); 
test1.printName();
0 知識前導:
jvm每個執行緒都擁有一個方法呼叫棧,用於跟蹤執行緒中執行的一系列方法呼叫過程,
  棧中的每個元素成為棧幀,執行緒呼叫每個方法時會將方法棧壓入一個新幀,
  幀裡面存放方法引數,區域性變數,運算過程產生的臨時資料
  
1 jvm去方法區尋Sample類資訊
2 尋找不到,jvm使用classloader載入Sample類資訊進入記憶體方法區
3 在堆記憶體中建立Sample物件,並持有方法區中Sample類的型別資訊的引用
4 test1新增到執行main()方法的主執行緒java呼叫棧中,指向堆空間中的記憶體物件
5 執行test1.printName()時,jvm根據test1定位到堆空間的Sample例項,在根據
Sample例項在方法區持有的引用,定位到方法區Sample型別資訊,獲得printName()
位元組碼,執行此方法執行,打印出結果。

下面再補充幾個圖,進一步瞭解: