整理jvm概念和原理詳解以及gc機制

注:源代碼就是.java文件,JVM字節碼就是.class文件java

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寄存器,是一塊較小的內存空間,它能夠看作是當前線程所執行的字節碼的第幾行號指示器。
在虛擬機的概念模型裏,字節碼解釋器工做時就是經過改變這個計數器的值來選取下一條須要執行的字節碼指令、分支、循環、跳轉、異常處理、線程恢復等基礎功能都須要依賴這個計數器來完成。多線程

總結: 虛擬機棧、本地方法棧、程序計數器這三個模塊是線程私有的,有多少線程就有多少個這三個模塊,聲明週期跟所屬線程的聲明週期一致。以程序計數器爲例,由於多線程是經過線程輪流切換和分配執行時間來實現,app

因此當線程切回到正確執行位置,每一個線程都有獨立的程序技術器,各個線程之間的計數器互不影響,獨立存儲。其他是跟JVM虛擬機的生命週期一致共享的。
————————————————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,spa

在這裏能夠認爲bin裏的就是jvm,lib中則是jvm工做所須要的類庫,而jvm和 lib合起來就稱爲jre。

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

更詳細的解釋說明鏈接;https://blog.csdn.net/qq_38384440/article/details/81710887

14. gc回收的內容:
gc的主要做用是回收堆中的對象。經過分析一個對象的引用是否存在,若是不存在,就能夠被回收了。

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

16. 經常使用的垃圾回收器:
(1)Serial收集器【串行收集器】
(2)ParNew收集器【串行收集器的多線程版本】
(3)Parallel Scavenge收集器【PS收集器】
(4)CMS【老年代收集器】
(5)G1收集器
關於垃圾回收器的使用,這裏也有一個組合建議共你們參考:

相關文章
相關標籤/搜索