1. 程式人生 > >java 堆 棧 方法區 資料存放 操作流程

java 堆 棧 方法區 資料存放 操作流程

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


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

方法區域(又叫 靜態區) 
 1 字串常量
 2 static
 3 所有的class
 a) 被所有執行緒共享, 其記憶體放程式中永遠唯一的元素,eg: 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);
	}
}

執行分析:

Java程式碼  收藏程式碼

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()
位元組碼,執行此方法執行,打印出結果。

 看另一個案例圖,再次瞭解下 各個區域存放資料的位置:

,,,

轉載自:http://chengjianxiaoxue.iteye.com/blog/2153147