JVM學習-01:JVM概述及發展歷程

虛擬機與Java虛擬機介紹

虛擬機

虛擬機(Virtual Machine)顧名思義就是虛擬的計算機。是一款軟件,用來執行一系列虛擬計算機指令。虛擬機一般分爲 系統虛擬機 和 程序虛擬機。

  • Visual Box,VMware就屬於系統虛擬機,是對物理計算機的仿真,提供了一個可運行完整操作系統的軟件平臺
  • Java虛擬機就是典型的程序虛擬機,專門爲執行單個計算機程序設計,在Java虛擬機中執行的指令稱爲Java字節碼指令

Java虛擬機

Java虛擬機是一臺執行Java字節碼的虛擬計算機,JVM平臺的各種語言可以共享Java虛擬機帶來的跨平臺性、優秀的垃圾回收器和可靠的即時編譯器。

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

特點

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

跨語言的平臺JVM

Java7以後,Java虛擬機平臺就可以運行非Java語言編寫的程序。Java虛擬機根本不關心運行在其內部的程序是使用何種編程語言編寫,它只關心"字節碼"文件

image-20200703000823097

  • 編譯器的前端:各個語言自己的編譯器
  • 編譯起的後端:Java虛擬機的解釋器和 JIT即時編譯器

信息產業領域三大難題:cpu、操作系統、編譯器。

Java平臺上的多語言混合編程正成爲主流,各種語言之間的交互不存在任何困難,就像使用自己語言的原生API一樣方便,因爲它們最終都運行在一個虛擬機上。Java虛擬機在從“Java語言虛擬機”向“多語言虛擬機”方向發張。

Java及JVM歷史事件

  • 1990年:Sun公司中James Gosling 等領導的小組Green Team開發出新的程序語言Java
  • 2000年:JDK1.3發佈,Java HotSpot Virtual Machine正式發佈,成爲Java默認虛擬機
  • 2003年底:Java平臺的Scala正式發佈,同年Groovy也加入了Java陣營
  • 2006年:JDK6發佈,Java開源並建立了OpenJDK。HotSpot虛擬機也成爲了OpenJDK中默認虛擬機
  • 2008年:Oracle收購了BEA,得到了JRockit虛擬機
  • 2009年:Oracle收購了Sun,獲得了Java商標和最具有價值的HotSpot虛擬機
  • 2011年:JDK7發佈,正式啓用了新的垃圾回收器G1
  • 2018年:JDK11發佈,LTS(長期支持版本)版本JDK,發佈革命性的ZGC
  • 2019年:JDK12發佈,加入RedHat領導開發的Shenandoah GC

OpenJDK與OracleJDK:JDK11之前,OracleJDK(商用)比OpenJDK(開源)多一些閉源的功能。但在JDK11中,兩者基本完全一致。

JVM的發展歷程

Sun Classic VM

  • 1996年Java1.0版本,Sun公司發佈了Sun Classic VM的 Java 虛擬機,JDK1.4時完全被淘汰。
  • 這款虛擬機只提供解釋器
  • 如果使用JIT編譯器,就需要進行外掛。一旦使用JIT編譯器,解釋器就不再進行工作。解釋器和編譯器不能配合工作

Exact VM

  • jdk1.2時,sun提供了該虛擬機
  • Exact Memory Management:準確式內存管理
    • Non-Conservative/Accurate Memory Management
    • 虛擬機可以知道內存中某個位置的數據類型
  • 具備高性能虛擬機的雛形,還沒完全實現
    • 熱點探測
    • 編譯器與解釋器混合工作模
  • 使用短暫,該虛擬機還沒怎麼開始就被HotSpot替換了

SUN公司的 HotSpot VM

2009年,Sun公司被Oracle公司收購。

  • JDK1.3時,HotSpot VM稱爲默認虛擬機
  • HotSpot從服務器、客服端到移動端,嵌入式都有應用
  • HotSpot名稱指的就是他的熱點代碼探測技術
    • 通過計數器找到最具編譯價值代碼,觸發即時編譯或棧上替換
    • 通過編譯器與解釋器協同工作,在最優化的程序響應時間與最佳執行性能中取得平衡

BEA 的 JRockit

2008年,BEA被Oracle公司收購。Java之父高斯林目前就職於谷歌,研究人工智能和水下機器人

  • 專注於服務器端應用可以不關注啓動速度,JRockit內部不包含解析器實現,全部代碼靠即時編譯器編譯後執行
  • JRockit JVM是世界上最快的JVM
  • Oracle在JDK 8中大致整合兩大優秀虛擬機,在HotSpot的基礎上移植JRockit的優秀特性

IBM 的 J9

  • IBM Technology for Java Virtual Machine,簡稱 IT4J,內部代號 J9
  • 與HotSpot定位一致,在服務端、桌面端、嵌入式等都有用途
  • 與IBM自己的硬件相耦合,是最快的虛擬機,與外面其他配合使用還是比不過JRockit

Graal VM

  • 2018年4月,Oracle Labs公開了Graal VM,稱“Run Programs Faster Anywhere
  • Graal VM在HotSpot VM基礎上增強成跨語言全棧虛擬機,可以作爲“任何語言”的運行平臺使用。之前已經集成的 Java、Scala、Groovy、Kotlin;C、C++、JavaScript、Ruby、Python、R等
  • Graal VM未來有可能會替代掉HotSpot虛擬機

總結:

  • 三款高性能Java虛擬機:HotSpot、JRockit、C9,使用在通用硬件平臺上。
  • 兩款高性能Java虛擬機中的戰鬥機:Azul VM 和 BEA Liquid VM,他們與特定硬件平臺綁定、軟硬件配合的專有虛擬機。
  • 具體JVM的內存結構取決於不同廠商的JVM實現或者同一廠商發佈的不同版本,都有可能存在一定差異。

JVM位置

硬件 --》 操作系統 --》 JVM --》 字節碼文件 --》 用戶User。

image-20200704095539202

圖片來源於:https://docs.oracle.com/javase/8/docs/

JVM的整體結構

image-20200704103334167

以HotSpot爲代表:採用解釋器與即時編譯器並存的架構

  • 字節碼文件(Class files)
  • 類裝載器子系統(Class loader)
  • 運行時數據區(Runtime Data Area)
    • 線程共享:方法區(Method Area)、堆(heap)
    • 線程私有:Java虛擬機棧(Java stack)、本地方法棧(Native Method Stack)、程序計數器(Program Counter Register)
  • 執行引擎(Execution Engine)
  • 本地方法接口(Native Interface)、本地方法庫

Java代碼的執行流程

image-20200704095622133

爲什麼不一次性都編譯所有代碼,這樣不更好的節省效率麼?

  • 編譯過程耗時,程序運行速度慢,啓動慢
  • code catch的內存有可能會溢出,也及時方法區內存不夠

JVM的架構模型

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

基於棧式架構的特點

  • 使用零地址指令方式分配
  • 指令流中的指令大部分是零地址指令,其執行過程依賴於操作棧指令集更小,編譯器容易實現
  • 不依賴硬件支持,可移植性更好,更好的實現跨平臺

基於寄存器架構的特點

  • 指令集架構則完全依賴硬件,可移植性差
  • 性能優秀和執行更高效
  • 更少的指令完成一項操作

大部分情況下,基於寄存器架構的指令集往往都以一地址指令、二地址指令和三地址指令爲主,而基於棧式架構的指令集是以零地址指令爲主。

總結:

由於跨平臺性的設計,Java的指令都是根據棧來設計的。不同平臺CPU架構不同,所以不能設計爲基於寄存器的。優點是跨平臺性,指令集小,編譯器容易實現;缺點是執行性能比寄存器差,實現同樣的功能需要更多的指令

字節碼文件可以在命令行操作: javap -v 文件名.class 進行反編譯,查看字節碼指令,也可以使用 jps 指令查看當前應用的進程。

JVM的生命週期

虛擬機的啓動

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

虛擬機的執行

程序開始執行時,虛擬機才運行,程序結束時才停止。執行一個所謂的Java程序時,真真正正執行的是一個叫做Java虛擬機的進程

終端窗口命令:jps 命令可查看當前程序的進程情況

虛擬機的退出

  • 程序正常執行結束
  • 程序執行過程中遇到異常或錯誤而異常終止
  • 操作系統出現錯誤導致Java虛擬機進程終止
  • 某線程調用Runtime類或System類的exit方法,或Runtime類的halt方法,並且Java安全管理器也允許這次exit或halt操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章