jvm堆棧方法區數據存放和操做流程

棧: 
 1 基礎數據類型 byte short int long float double char boolean
 2 方法的形式參數,方法調用完後從棧空間回收
 3 引用對象的地址,引用完後,棧空間地址當即被回收,堆空間等待GC
 a) 棧內的數據線程之間獨立
 b) 具體細分爲:
  b.1) 基本類型變量區
  b.2) 執行環境上下文
  b.3) 操做指令區java

 


 1 this
 2 new出來的對象
 3 數組
 a) jvm只有一個堆區,並被全部線程共享。數組

 

方法區域(又叫 靜態區) 
 1 字符串常量
 2 static
 3 全部的class
 a) 被全部線程共享, 其內存放程序中永遠惟一的元素,eg: static classjvm

 

案例分析this

  1. public class AppMain {// 運行時 jvm把類信息加入方法區    
  2.     
  3.     /**  
  4.      * @param args  
  5.      */    
  6.     public static void main(String[] args) {// main方法放入方法區    
  7.     
  8.         Sample test1 = new Sample("hello"); // test1是引用 放入棧中 new Sample("hello")對象放入堆中    
  9.         test1.printName();    
  10.             
  11.     }    
  12.     
  13. }    
  14.   
  15. class Sample { // 運行時 jvm把 類信息放入方法區    
  16.         
  17.     private String name; // new Sample()後, name 引用放入棧  name對象放入堆    
  18.         
  19.     public Sample(String name){    
  20.         this.name = name;    
  21.     }    
  22.         
  23.     public void printName(){ // 方法自己放入方法區    
  24.         System.out.println(name);    
  25.     }    
  26. }    


 

  1. Sample test1 = new Sample("hello");     
  2. test1.printName();    
  3. 0 知識前導:    
  4. jvm每一個線程都擁有一個方法調用棧,用於跟蹤線程中運行的一系列方法調用過程,    
  5.   棧中的每一個元素成爲棧幀,線程調用每一個方法時會將方法棧壓入一個新幀,    
  6.   幀裏面存放方法參數,局部變量,運算過程產生的臨時數據    
  7.       
  8. 1 jvm去方法區尋Sample類信息    
  9. 2 尋找不到,jvm使用classloader加載Sample類信息進入內存方法區    
  10. 3 在堆內存中建立Sample對象,並持有方法區中Sample類的類型信息的引用    
  11. 4 test1添加到執行main()方法的主線程java調用棧中,指向堆空間中的內存對象    
  12. 5 執行test1.printName()時,jvm根據test1定位到堆空間的Sample實例,在根據    
  13. Sample實例在方法區持有的引用,定位到方法區Sample類型信息,得到printName()    
  14. 字節碼,執行此方法執行,打印出結果。    


 看另外一個案例圖,再次瞭解下 各個區域存放數據的位置:.net

相關文章
相關標籤/搜索