天天看點

【搞定JVM】開篇:JVM介紹與知識脈絡梳理

轉發自:https://blog.csdn.net/a724888/article/details/77992936

前言:

JVM(Java Virtual Machine):Java 虛拟機是整個 java 平台的基石,是 java 系統實作硬體無關與作業系統無關的關鍵部分,是保障使用者機器免于惡意代碼損害的屏障。Java開發人員不需要了解JVM是如何工作的,**但是,**了解 JVM 有助于我們更好的開(通)發(過) java(公司) 程(面)序(試)。

 寫這篇文章的目的:

  • 總結所學的 JVM 知識
  • 幫助想了解 JVM 的朋友,知無不言,言無不盡

本篇文章将會介紹一下内容:

一、什麼是JVM

二、JVM用來做什麼事情

三、JVM生命周期

四、JVM的整體架構

五、文章推薦

一、什麼是JVM

要想說明白什麼 JVM 就不得不提另外兩個概念,JRE 和 JDK,初學者總是把這幾個概念搞混。

【搞定JVM】開篇:JVM介紹與知識脈絡梳理

Jvm,Jre,Jdk 都是 java 語言的支柱,他們分工協作。但不同的是 Jdk 和 Jre 是真實存在的,而 Jvm 是一個抽象的概念,并不真實存在。

JDK:

        JDK(Java Development Kit) 是 Java 語言的軟體開發工具包(SDK)。JDK 實體存在,是 programming tools、JRE 和 JVM 的一個集合。如下圖所示:

【搞定JVM】開篇:JVM介紹與知識脈絡梳理

JRE:

        JRE(Java Runtime Environment)Java 運作時環境,JRE 實體存在,主要由Java API 和 JVM 組成,提供了用于執行 java 應用程式最低要求的環境。

【搞定JVM】開篇:JVM介紹與知識脈絡梳理

Jvm:

JVM(Java Virtual Machine) 是一種軟體實作,執行像實體機程式的機器(即電腦)。

本來,Java被設計基于從實體機器分離實作WORA( 寫一次,随處運作 )的虛拟機上運作,雖然這個目标已經幾乎被遺忘。

JVM 并不是專為 Java 所實作的運作時,實際上隻要有其他程式設計語言的編譯器能生成正确 Java bytecode 檔案,則這個語言也能實作在JVM上運作。

是以,JVM 通過執行 Java bytecode 可以使 java 代碼在不改變的情況下運作在各種硬體之上。

JVM 有如下特點:

(1)基于堆棧的虛拟機 :最流行的計算機體系結構,如英特爾X86架構和ARM架構上運作基于寄存器 。 但是,JVM是基于棧的;

(2)符号引用 :除了基本類型以外的資料(類和接口)都是通過符号來引用,而不是通過顯式地使用記憶體位址來引用;

(3)垃圾收集 :一個類的執行個體是由使用者明确建立的代碼和垃圾回收自動銷毀;

(4)通過明确界定的基本資料類型的保證平台的獨立性 :傳統的語言,如C / C ++根據平台有不同的int型的大小。 JVM中明确規定了基本資料類型,以保持它的相容性和保證平台的獨立性;

(5)網絡位元組順序 :Java class檔案用網絡位元組碼順序來進行存儲:為了保證和小端的Intel x86架構以及大端的RISC系列的架構保持無關性,JVM使用用于網絡傳輸的網絡位元組順序,也就是大端。

**Java bytecode **

為了實作WORA,JVM使用Java位元組碼,java(使用者語言)和機器語言之間的中間語言。

該Java位元組碼是部署Java代碼的最小機關。

二、JVM用來做什麼事情

基于安全方面考慮,JVM 要求在 class 檔案中使用許多強制性的文法和機構化限制,但任意一門功能性語言都可以表示為一個能被 JVM 接受的有效的 class 檔案。作為一個通用的、機器無關的執行平台,任何其他語言的實作者都可将 JVM 當作他的語言産品傳遞媒介。

JVM 中執行以下操作:

  • 加載代碼
  • 驗證代碼
  • 執行代碼
  • 提供運作環境

JVM 提供定義了:

  • 存儲區
  • 類檔案格式
  • 寄存器組
  • 垃圾回收堆
  • 緻命錯誤報告等

三、JVM生命周期

  • 啟動:任何一個擁有main函數的class都可以作為JVM執行個體運作的起點
  • 運作:main函數為起點,程式中的其他線程均有它啟動,包括daemon守護線程和non-daemon普通線程。daemon是JVM自己使用的線程比如GC線程,main方法的初始線程是non-daemon。
  • 消亡:所有線程終止時,JVM執行個體結束生命。

四、JVM的整體架構

先看一下Java代碼的執行過程:

【搞定JVM】開篇:JVM介紹與知識脈絡梳理

五、文章推薦

1、Jvm系列(一):java類的加載機制

第一篇文章講的是Java類的加載機制,也是我在部落格園最收歡迎的Jvm文章,讀完之後你會了解什麼是類加載器、類加載機制、雙親委派模型等内容。

2、Jvm系列(二):JVM記憶體結構

這篇文章描述了Java虛拟機的記憶體結構,記憶體每個區域作用,如何通過參數對各個區域進行控制。

3、Jvm系列(三):GC算法 垃圾收集器

講述了Jvm垃圾回收的經典算法,以及各種垃圾回收機制,對象存活判斷等。

4、Jvm系列(四):jvm調優-指令篇

這篇文章講述了如何通過Jvm指令去調優,各Jvm指令使用方法。

5、Jvm系列(五):Java GC分析

這是非常有名的一張圖,簡單明了展示了GC日志的構成

文章介紹如何分析GC日志來診斷Java項目的運作狀态,GC分析是生産調優的重要手段之一。

6、Jvm系列(六):Java服務GC參數調優案例

一名網友根據GC日志,進行Jvm調優的經典案例

7、Jvm系列(七):jvm調優-工具篇

介紹了Jvm調優各種工具的使用

8、Jvm系列(八):jvm知識點總覽

如何你隻是想通過面試,其實隻要看一篇就夠了,這篇文章将Jvm中的關鍵知識點進行了彙總。

9、Jvm系列(九):如何優化Java GC

翻譯自國外的一篇Java GC文章,文章較長的描述幾種GC調優的方式,值得借鑒。

10、Jvm系列(十):教你如何成為Java的OOM Killer

也是線上一場線上Jvm實戰調優的經曆,看着挺爽。

11、Jvm系列(十一):Java 8-從持久代到metaspace

Java 8 Jvm記憶體變化。

12、Jvm系列(十二):Java 8的新特性—終極版

杜琪翻譯的 Java 8 的新特性。

13、一個腳本引發的血案

我們曾經線上出現事故後,定位分析的經曆,結局出乎意料。