0x01.JVM內存劃分關係
JVM體系結構(簡單版)
運行時數據區的主要作用:
區域名稱 | 實際作用 |
---|---|
寄存器 | 保存有當前正在執行的JVM指令的地址。 |
本地方法棧 | 爲JVM使用到的Native方法服務 |
方法區 | 存儲可執行的.class文件 |
堆內存 | 存儲數組或者對象 |
方法棧 | 方法運行時使用的內存 |
本文主要研究運行時數據區中的堆,棧,方法區
0x02.分析一段簡單代碼,瞭解數組數組創建過程
- 看一下下面這段代碼:
public stativ void main(String args[]){
int[] a=new int[5];
System.out.println(a);
}
- 相信大家很容易知道,輸出的內容就是a數組在內存中的地址。
- 那這個地址實際上指的是哪裏呢?
- 我們一起分析一下這個程序的運行流程:
僅分析一下主要new出數組的過程,其它的細節此處省略。
堆棧上的主要執行流程:
1.main方法入棧:
2.讀取new語句,在堆中開闢空間,存儲數據:
-
堆會給數組分配初始值。
-
到這裏,我們應該就可以知道,實際的地址是在堆中分配的地址。
0x03.通過堆-棧-方法區,瞭解對象在內存中存儲
- 再來看一段簡單的代碼:
- 一個People類:
public class Peolple{
String name;
int age;
String sex
public void eat{
System.out.println("吃飯");
}
}
- main方法:
public static void main(String args[]){
Perple people=new People();
people.name="ATFWUS";
people.age=18;
people.sex="man";
people.eat();
}
內存結構分析(單個對象):
0x04.細究堆-棧-方法區在內存中的作用
- 堆和棧的關係用一句話描述就是:棧管運行,堆管存儲
1.堆
-
主要:用來存放程序動態生成的數據。
-
重點:堆是內存中共享的區域,要考慮線程安全的問題。
-
凡是
new
出來的對象,都在堆中:- 存儲的是成員變量。
- 靜態變量存儲在方法區。
- 而成員變量的值存儲在常量池中。
- 成員方法存儲在方法區中,是此類所有實現實例共享的。
-
常量池:
- 常量池在堆中。
- JVM爲每一個加載的類維護一個常量池。
- 用於存儲成員變量中的數值。
2.棧
-
棧是線程獨享的。每一個線程都有自己的線程棧。
-
棧的生命週期跟隨線程的生命週期。
-
棧存儲的數據:(棧幀)
- ① 本地變量 : 參數,返回值,方法內的變量;
- ② 棧操作 : 棧指針(ebp,esp);
- ③ 棧幀數據 : 類文件、方法等。
-
棧是方法運行時使用的內存。
3.方法區
-
供各線程 共享 的運行時內存區域。
-
存儲了每一個類的結構信息。
-
方法區主要用於存儲已經被虛擬機加載的類的信息、常量、靜態變量等。
- 在JVM加載某個類時,會抽取出對應.class文件中類相關的信息並以特定結構存到方法區中,當程序運行時,JVM則會到方法區中去查找使用對應類信息。