Java虛擬機器:Jvm概念和原理詳解以及GC機制的分析

RDJ發表於2020-01-06

Java虛擬機器:Jvm概念和原理詳解以及GC機制的分析

注:原始碼就是.java檔案,JVM位元組碼就是.class檔案

1. Java 堆(Java Heap): (1)是Java虛擬機器所管理的記憶體中最大的一塊。 (2)在虛擬機器啟動的時候建立。堆是jvm所有執行緒共享的。 (3)唯一目的就是存放物件例項,幾乎所有的物件例項以及陣列都要在這裡分配記憶體。

2. JVM棧(java虛擬機器棧): (1)每個執行緒建立的同時會建立一個JVM棧幀,JVM棧中每個棧幀存放的為當前執行緒中區域性基本型別的變數.

3. 本地方法棧(Native Method Stack): (1)jvm中的本地方法是指方法的修飾符是帶有native的,但是方法體不是用java程式碼寫的另一類方法。 (2)作用同java虛擬機器棧類似,區別是:虛擬機器棧為虛擬機器執行Java方法服務,而本地方法棧則是為虛擬機器使用到的Native方法服務。 (3)是執行緒私有的,它的生命週期與執行緒相同,每個執行緒都有一個。

4. 方法區(Method Area): (1)在虛擬機器啟動的時候建立。所有jvm執行緒共享。 (2)用於存放所有已被虛擬機器載入的類資訊、常量、靜態變數、以及編譯後的方法實現的二進位制形式的機器指令集等資料。

5. 程式計數器(Program Counter Register): 也叫PC暫存器,是一塊較小的記憶體空間,它可以看做是當前執行緒所執行的位元組碼的第幾行號指示器。 在虛擬機器的概念模型裡,位元組碼直譯器工作時就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令、分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴這個計數器來完成。

Java虛擬機器:Jvm概念和原理詳解以及GC機制的分析

總結: 虛擬機器棧、本地方法棧、程式計數器這三個模組是執行緒私有的,有多少執行緒就有多少個這三個模組,宣告週期跟所屬執行緒的宣告週期一致。以程式計數器為例,因為多執行緒是通過執行緒輪流切換和分配執行時間來實現,

所以當執行緒切回到正確執行位置,每個執行緒都有獨立的程式技術器,各個執行緒之間的計數器互不影響,獨立儲存。其餘是跟JVM虛擬機器的生命週期一致共享的。 ————————————————

6.類載入器子系統(class loader subsystem): (1)根據給定的類名(如java.lang.Object)來裝載class檔案的內容到Runtimedataarea中的methodarea(方法區域)。 (2)對(1)中的載入過程是:當一個classloader啟動時,classloader的生存地點在jvm中的堆,然後它去主機硬碟上去裝載A.class到jvm的methodarea(方法區)

7.執行引擎 : (1)負責執行來自類載入器子系統(class loader subsystem)中被載入類中在方法區包含的指令集,通俗講就是類載入器子系統把程式碼邏輯 (什麼時候該if,相加,相減)都以指令的形式載入到了方法區,執行引擎就負責執行這些指令就行了。

8.直譯器: 一條一條地讀取,解釋並且執行位元組碼指令。因為它一條一條地解釋和執行指令,所以它可以很快地解釋位元組碼,但是執行起來會比較慢。這是解釋執行的語言的一個缺點。位元組碼這種“語言”基本來說是解釋執行的。

9.編譯器: (1. 即時編譯器被引入用來彌補直譯器的缺點。執行引擎首先按照解釋執行的方式來執行,然後在合適的時候,即時編譯器把整段位元組碼編譯成原生程式碼。 (2. 然後,執行引擎就沒有必要再去解釋執行方法了,它可以直接通過原生程式碼去執行它。執行原生程式碼比一條一條進行解釋執行的速度快很多。編譯後的程式碼可以執行的很快,因為原生程式碼是儲存在快取裡的。

9.1.  jdk,jre,JVM的關係:

JDK(Java Development Kit) 是 Java 語言的軟體開發工具包(SDK)。在JDK的安裝目錄下有一個jre目錄,裡面有兩個資料夾bin和lib,

在這裡可以認為bin裡的就是jvm,lib中則是jvm工作所需要的類庫,而jvm和 lib合起來就稱為jre。

Java虛擬機器:Jvm概念和原理詳解以及GC機制的分析

10. 上圖,堆記憶體分為三部分: (1.新生區:是類的誕生、成長、消亡的區域,一個類在這裡產生,應用,最後被垃圾回收器收集,結束生命。 (2.養老區:用於儲存從新生區篩選出來的 JAVA 物件,一般池物件都在這個區域活躍。 (3.永久儲存區是一個常駐記憶體區域,用於存放JDK自身所攜帶的 Class,Interface 的後設資料, 也就是說它儲存的是執行環境必須的類資訊,被裝載進此區域的資料是不會被垃圾回收器回收掉的,關閉 JVM 才會釋放此區域所佔用的記憶體。

11. 出現java.lang.OutOfMemoryError: Java heap space異常,說明Java虛擬機器的堆記憶體不夠。 原因有二: (a.Java虛擬機器的堆記憶體設定不夠,可以通過引數-Xms、-Xmx來調整。 (b.程式碼中建立了大量大物件,並且長時間不能被垃圾收集器收集(存在被引用)。

12.雙親委派機制: JVM在載入類時預設採用的是雙親委派機制。通俗的講: 就是某個特定的類載入器在接到載入類的請求時,首先將載入任務委託給父類載入器,依次遞迴,(bootStrap、extclassLoader、appclassloader三個是父子類載入器) 如果父類載入器可以完成類載入任務,就成功返回;只有父類載入器無法完成此載入任務時,才自己去載入。

13. 什麼時候會發生Full GC? (1)呼叫System.gc()方法的 (2)老年代空間不足。【老年代空間只有在新生代物件轉入及建立大物件、大陣列時才會出現不足的現象】 (3)永生區空間不足。 (4)堆中分配很大的物件。【例如很長的陣列,此種物件會直接進入老年代】 (5)CMS GC時出現promotion failed和concurrent mode failure

14. gc回收的內容: gc的主要作用是回收堆中的物件。通過分析一個物件的引用是否存在,如果不存在,就可以被回收了。

15.gc的具體過程: 這個主要看是用的哪一種回收演算法以及用的什麼垃圾回收集了。回收演算法主要有: (1)標記-清除演算法 (2)標記-整理演算法 (3)複製演算法 (4)分代收集演算法

16. 常用的垃圾回收器: (1)Serial收集器【序列收集器】 (2)ParNew收集器【序列收集器的多執行緒版本】 (3)Parallel Scavenge收集器【PS收集器】 (4)CMS【老年代收集器】 (5)G1收集器 關於垃圾回收器的使用,這裡也有一個組合建議共大家參考:

Java虛擬機器:Jvm概念和原理詳解以及GC機制的分析

歡迎關注公眾號:老男孩的成長之路,精選乾貨每週定期奉上!

Java虛擬機器:Jvm概念和原理詳解以及GC機制的分析

相關文章