棧:
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
- 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);
- }
- }
![](http://static.javashuo.com/static/loading.gif)
- 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()
- 字節碼,執行此方法執行,打印出結果。
看另外一個案例圖,再次瞭解下 各個區域存放數據的位置:.net
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)