JVM整體結構-java棧詳解

JVM整體結構

JVM與VMWare都是虛擬機的一種。
JVM由三個子系統構成:

  1. 類加載器子系統
  2. 運行時數據區(內存結構)
  3. 執行引擎(包含垃圾收集器)

下圖是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中,該引用對象會在FromTo中進行15次輪詢。每次輪詢過程是這樣的:

輪詢過程:
From進行輕GC,該對象存在引用則放到To中。
To進行輕GC,該對象存在引用則放到From中。(其實此時To已變成FROM。不用管,反正就是在這兩個之間轉來轉去。)
如果15次輪詢後該對象還存在引用,則放到Old Generation中。

Old Generation的GC機制採用的Full GC,會耗費較大的內存。

執行引擎

執行引擎:讀取運行時數據區的java字節碼並逐個執行。
(這個要開展的話會很深,等博主能力提高了再去了解吧。)
在這裏插入圖片描述

劃重點(∩_∩)



本人程序媛一枚,因爲離港澳較近,週末兼職港澳人肉代購。

歡迎各位大佬添加本人微信,還會經常有點贊活動送價值不菲的小禮品哦。

即使現在不需要代購,等以後有了女(男)朋友、有了寶寶就肯定會需要的嘍。

動動手指頭,掃碼一下,就當是對本博文的支持嘛,也是對一個平凡、勤勞、勇敢、秀外慧中等等優點的程序媛莫大的支持哈。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章