JVM 從入門到精通(二)JVM和Java體系結構

寫在前面:我是「雲祁」,一枚熱愛技術、會寫詩的大數據開發猿。暱稱來源於王安石詩中一句 [ 雲之祁祁,或雨於淵 ] ,甚是喜歡。


寫博客一方面是對自己學習的一點點總結及記錄,另一方面則是希望能夠幫助更多對大數據感興趣的朋友。如果你也對 數據中臺、數據建模、數據分析以及Flink/Spark/Hadoop/數倉開發 感興趣,可以關注我的動態 https://blog.csdn.net/BeiisBei ,讓我們一起挖掘大數據的價值~


每天都要進步一點點,生命不是要超越別人,而是要超越自己! (ง •_•)ง

一、Java 和 JVM 簡介

1.1 Java:跨平臺的語言

在這裏插入圖片描述

1.2 JVM:跨語言的平臺

在這裏插入圖片描述
Java不是最強大的語言,但是JVM是最強大的虛擬機。

1.3 Java 及 JVM 歷史上重大事件

在這裏插入圖片描述
在 JDK11之前,OracleJDK中還會存在一些OpenJDK中沒有的、閉源的功能。但在JDK11中,我們可以認爲OpenJDK和OracleJDK代碼實質上已經完全一致的程度。

1.4 計算機系統當中JVM所處的位置

Java虛擬機

Java虛擬機就是二進制字節碼的運行環境,負責裝載字節碼到其內部,解釋 / 編譯爲對應平臺上的機器指令執行。每一條Java指令,Java虛擬機規範中都有詳細定義,如怎麼取操作數,怎麼處理操作數,處理結果放在哪裏。

特點

  • 一次編譯,到處運行
  • 自動內存管理
  • 自動垃圾回收功能

JVM 的位置
在這裏插入圖片描述
Java代碼的執行流程

在這裏插入圖片描述
Java一次編譯,到處運行。

在這裏插入圖片描述

二、JVM的整體結構

在這裏插入圖片描述

  • HotSpot VM 是目前市面上高性能虛擬機的代表作之一。
  • 它採用解釋器與即時編譯器並存的架構。
  • 在今天,Java程序的運行性能早已脫胎換骨,已經達到了可以和C/C++程序一教高下的地步。

1、方法區和堆區是所有線程共享的內存區域;而Java棧、本地方法棧和程序員計數器是運行是線程私有的內存區域。

2、Java棧又叫做JVM虛擬機棧

3、方法區(永久代)在JDK1.8中又叫做元空間Metaspace

方法區用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器(JIT編譯器,英文寫作Just-In-Time Compiler)編譯後的代碼等數據。雖然Java虛擬機規範把- 方法區描述爲堆的一個邏輯部分,但是它卻有一個別名叫做 Non-Heap(非堆),目的應該是與 Java 堆區分開來。

  • 在JDK1.7之前運行時常量池邏輯包含字符串常量池存放在方法區, 此時hotspot虛擬機對方法區的實現爲永久代
  • 在JDK1.7 字符串常量池被從方法區拿到了堆中, 這裏沒有提到運行時常量池,也就是說字符串常量池被單獨拿到堆,運行時常量池剩下的東西還在方法區, 也就是hotspot中的永久代
  • 在JDK1.8之後JVM 已經將運行時常量池從方法區中移了出來,在 Java 堆(Heap)中開闢了一塊區域存放運行時常量池。同時在JDK1.8中移除整個永久代,取而代之的是一個叫元空間(Metaspace)的區域

4、Java代碼執行流程:

Java程序 —>(編譯javac)—> 字節碼文件.class —> 類裝載子系統化身爲反射類Class —> 運行時數據區 —>(解釋執行)—> 操作系統(Win、Linux、Mac JVM)

三、JVM的架構模型

Java編譯器輸入的指令流基本上是一種基於棧的指令集架構,另外一種指令集架構則是基於寄存器的指令集架構。

由於跨平臺的設計,Java的指令都是根據棧來設計的,不同平臺CPU架構不同,所以不能設計爲基於寄存器的

二者區別:

棧:跨平臺性、指令集小、指令多;執行性比寄存器差
寄存器:指令少

一些簡單查看命令:

//查看指令集命令代碼
cd out/production/類根目錄

//反編譯
javap -v StackStruTest.class

//打印程序執行的進程
jps

四、JVM的生命週期

4.1 啓動

通過引導類加載器(bootstrap class loader)創建一個初始類(initial class)來完成的,這個類是由虛擬機的具體實現指定的。

4.2 執行

  • 一個運行中的java虛擬機有着一個清晰的任務:執行Java程序;
  • 程序開始執行的時候他才運行,程序結束時他就停止;
  • 執行一個所謂的Java程序的時候,真真正正在執行的是一個叫做Java虛擬機的進程。

4.3 退出

  • 程序正常執行結束
  • 程序異常或錯誤而異常終止
  • 操作系統錯誤導致終止
  • 某線程調用Runtime類或System類的exit方法,或Runtime類的halt方法,並且java安全管理器也允許這次exit或halt操作
  • 除此之外,JNI規範描述了用JNI Invocation API來加載或卸載Java虛擬機時,Java虛擬機的退出情況

五、JVM的發展歷程

古今JVM

  • SUN Classic
  • Exact VM
  • HotSpot VM :HotSpot指熱點代碼探測技術
  • BEA JRockit:(BEA 已被Oracle收購) 專注於服務端應用,世界最快的jvm之一
  • IBM J9
  • Taobao JVM: 目前已經在淘寶、天貓上線,替換了- Oracle官方JVM;
  • Graal VM: Oracle 2018年4月公開,口號 Run Programs Faster Anywhere.最可能替代HotSpot的產品

Android虛擬機 DVM

  • 谷歌開發,基於Android,在2.2中提供了JIT
  • 只能稱作虛擬機 不能稱爲Java虛擬機,他沒有遵循Java虛擬機規範
  • 基於寄存器架構,效率高,但是跟硬件耦合度比較高
  • 不能直接執行class文件,執行的是dex文件
  • 5.0使用支持提前編譯的ART VM替換Dalvik VM
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章