一、什麼是JVM
JVM(Java Virtual Machine) ,中文名java虛擬機,是由軟件技術模擬出計算機運行的一個虛擬計算機。
java程序經過編譯後,產生 .class 文件, jvm 才能識別並運行它,jvm 針對每個操作系統開發出對應的編譯器,所以只要其操作系統有對應版本的jvm,那麼java程序便能運行起來,這是java可以一次編譯,到處運行的原因。
二、JRE、JDK和JVM的關係
JRE(Java Runtime Environment, Java運行環境)** 是Java平臺,所有的程序都要在JRE下才能夠運行。包括JVM和Java核心類庫和支持文件。
JDK(Java Development Kit,Java開發工具包)** 是用來編譯、調試Java程序的開發工具包。包括Java工具(javac/java/jdb等)和Java基礎的類庫(java API )。
JVM(Java Virtual Machine, Java虛擬機)** 是JRE的一部分。JVM主要工作是解釋自己的指令集(即字節碼)並映射到本地的CPU指令集和OS的系統調用。Java語言是跨平臺運行的,不同的操作系統會有不同的JVM映射規則,使之與操作系統無關,完成跨平臺性。
三、JVM基本概念
jvm基本結構如下:
說明: 方法區:線程共享的,用於存放被虛擬機加載的類的元數據信息:如常量、靜態變量、即時編譯器編譯後的代碼。也稱之為永久代,有一個別名叫做Non-Heap(非堆)。
在JDK8中,永久代已經被移除,被一個稱為“元數據區”(元空間)的區域取代。元空間的本質和永久代類似,都是對jvm規範中方法區的實現。不過元空間與永久代之間最大的區別在於:元空間並不在於虛擬機中,而是使用本地內存。因此,默認情況下,元空間的大小僅受本地內存限制。類的元數據放入元空間,字符串和類的靜態變量放入java堆中,這樣可以加載多少類的元數據就不再由MaxPermSize控制,而由系統實際可用空間控制。
採用元空間代替永久代的原因:
1. 字符串存在永久代中,容易出現性能和內存溢出。
2. 類及方法的信息等比較難確定其大小,因此對於永久代的大小指定比較困難,太小容易出現永久代溢出,太大容易導致老年代溢出(因為堆內存有限,此消彼長)
3. 永久代會為GC帶來不必要的複雜度,並且回收效率低。
四、JVM生命週期
1. 啟動:啟動一個Java程序,一個JVM實例就產生。擁有public static void main(String[] args)函數的class可以作為JVM實例運行的起點。
2. 運行: main()作為程序初始線程的起點,任何其他線程均可由該線程啟動。JVM內部有兩種線程:守護線程和非守護線程,main()屬於非守護線程,守護線程通常由JVM使用,程序可以指定創建的線程為守護線程。
3. 消亡:當程序中的所有非守護線程都終止時,JVM才退出;若安全管理器允許,程序也可以使用Runtime類或者System.exit()來退出。
五、JVM體系
- 類的加載機制
- jvm內存結構
- GC算法 垃圾回收
- GC分析 命令調優