JVM整體結構
JVM與VMWare都是虛擬機的一種。
JVM由三個子系統構成:
- 類加載器子系統
- 運行時數據區(內存結構)
- 執行引擎(包含垃圾收集器)
下圖是JVM結構圖:
本文重點:運行時數據區(內存結構)
藍色標記爲線程具體執行的,淺橙色標記的爲整個進程共享的。
- 堆:new 出來的對象都放在堆中
- java棧:線程運行的數據和計算都放在棧中
java棧
示例代碼:
package test;
public class Math {
public static final Integer NUMBER = 6;
public int math(){
int a =1;
int b = 2;
int c = (a+b)*10;
return c;
}
public static void main(String[] args) {
Math math = new Math();
math.math();
}
}
java棧結構圖
- 本地方法棧就是navicat的方法,基本不用。
線程運行時,java每個方法都會在java棧中有一個棧幀,棧幀是java具體方法存儲數據的地方。如上述代碼就有兩個棧幀。
根據棧先進後出,那麼先運行的main方法就是先把棧幀加載到java棧中,然後是math方法的棧幀加載到java棧中,math執行完移除java棧,回到main方法執行,執行完成也將main方法移出Java棧,Java棧就被清空了。
棧是先進後出,隊列是先進先出。
java棧中棧幀運行過程
將Math.java用命令行javac生成Math.class
再用如下命令生成文件Math.txt去分析棧幀的執行。
一定要結合 Math.txt的jvm命令集信息去理解java棧的運行過程。
javap -c Math.class > Math.txt
- 動態鏈接:接口類調用具體實現類的方法就會運用到動態鏈接。
堆
- 堆(線程共享):虛擬機啓動時創建,用於存放對象實例,幾乎所有的對象(包含常量池)都在堆上分配內存,當對象無法在該空間中請到內存時將拋出outOfMemoryErrot 異常。同時也是垃圾收染器管理的主要區域。可通過一 Xmx 一 XmS 參數來分別指定最大堆和最小堆。
- 堆結構圖如下
- 堆的運行機制
當我們new對象時,new出來的的對象先存放到Eden中,輕GC會定期執行,將Eden中無引用的對象清理掉。有引用的對象會被放到From中,該引用對象會在From和To中進行15次輪詢。每次輪詢過程是這樣的:
輪詢過程:
From進行輕GC,該對象存在引用則放到To中。
To進行輕GC,該對象存在引用則放到From中。(其實此時To已變成FROM。不用管,反正就是在這兩個之間轉來轉去。)
如果15次輪詢後該對象還存在引用,則放到Old Generation中。
Old Generation的GC機制採用的Full GC,會耗費較大的內存。
執行引擎
執行引擎:讀取運行時數據區的java字節碼並逐個執行。
(這個要開展的話會很深,等博主能力提高了再去了解吧。)
劃重點(∩_∩)
本人程序媛一枚,因爲離港澳較近,週末兼職港澳人肉代購。
歡迎各位大佬添加本人微信,還會經常有點贊活動送價值不菲的小禮品哦。
即使現在不需要代購,等以後有了女(男)朋友、有了寶寶就肯定會需要的嘍。
動動手指頭,掃碼一下,就當是對本博文的支持嘛,也是對一個平凡、勤勞、勇敢、秀外慧中等等優點的程序媛莫大的支持哈。