java 堆 棧 方法區 資料存放 操作流程
阿新 • • 發佈:2018-12-22
棧:
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); } }
執行分析:
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