JVM虛擬機器

軟工16009彭傑發表於2019-03-21

一、Java虛擬機器裡面有什麼東西

1.類載入子系統,方法區,Java堆,直接記憶體,垃圾回收器,執行引擎,Java棧,本地方法棧,PC暫存器。

(1)類載入子系統:從網路或者檔案系統中載入Class檔案。

(2)方法區:存字串,類的資訊,靜態方法,靜態常量等。

(3)Java堆:存Java物件(重點講

(4)直接記憶體:執行NIO庫操作需要大量讀寫,在直接記憶體裡執行效率更快。

(5)垃圾回收器:對垃圾回收演算法的實現。(重點講

(6)執行引擎:比如Hotspot(熱點探測)。執行引擎是將Class檔案編譯成本地的機器碼檔案,熱點探測就是頻繁將有些Class檔案轉換成本地機器碼檔案的Class檔案轉換成本地機器碼檔案快取在本地,後面就直接讀取快取。在JDK1.3開始測試,JDK1.5開始Hotspot開始商用。

(7)Java棧:存區域性變數,引數,方法呼叫,方法返回等

(8)本地方法棧:存系統方法呼叫,系統方法返回等

(9)PC暫存器:主要功能就是區別執行的方法是Java方法還是本地方法,如果是本地方法PC暫存器裡存的undefined。

二、Java堆

注意點:JDK1.7以前Java堆分為新生代,老年代,持久代。JDK1.7開始就測試取消持久代,因為持久代存的是常量,類的資訊,靜態常量等,可以發現和方法區存的東西基本一致。JDK1.8就已經取消持久代。

1.新生代:

 (1)新生代裡分為三個區域:eden,s0,s1。剛產生的物件是出生在eden區裡(大物件是直接放在老年代裡),當eden區快滿時,呼叫minor gc採用複製演算法(後面說)將存活的物件放到是s1中,如果s0中也有則也採用複製演算法,把存活物件放在s1中。然後清空s0和eden區,然後s0和s1交換位置。

2.老年代:

(1)新生代裡的物件每經歷一次Minor GC後,如果存活它的年齡加一。如果年齡到達15(JVM裡預設15,可以修改),則放到老年代中。老年代中的垃圾回收器叫Full GC(Minnor GC和Full GC都是對新生代及老年代裡垃圾回收器的總稱,其下還能細分,後面講)

三、垃圾回收器

1.垃圾回收演算法

垃圾回收器是對垃圾回收演算法的實現,我們先看看有哪些垃圾回收演算法。

(1)引用記數法:Java堆裡的物件,每有一個它的引用,它的計數就加一,每減少一個它的引用,它的計數就減一。GC就回收計數為0的物件。

(2)複製演算法:eden和s0區的物件在沒被清除掉並且年齡沒到15,則複製物件按順序存放到s1中。

(3)標記清除演算法:從物件的跟引用開始做標記,如果沒被標記就清除。缺點:產生碎片,工作時候使用者程式停止工作。

(4)標記整理演算法:從物件的跟引用開始做標記,如果沒被標記就清除。標記的物件則壓縮物件,放在按順序放在堆裡的一塊裡。缺點:工作時候使用者程式停止工作。

2.7個垃圾回收器

seral,parNew,parille scavege屬於新生代,CMS(CounConrrent make sweep),seral Old,parille Old屬於老年代。G1(gebarge first)新生代,老年代通吃。

(1)seral垃圾回收器(序列收集器):

                                                               1)運用演算法:複製演算法

                                                               2)缺點:需要兩倍空間,工作時候使用者程式停止。

(2)parNew垃圾回收器(並行收集器):

                                                               1)運用演算法:複製演算法

                                                               2)缺點:需要兩倍空間,工作時候使用者程式停止,                                                                       停止時間比seral垃圾回收器的停止時間短。

                                                               3)單核CPU運用此回收器不一定比用seral回收器                                                                       好,CPU邏輯數越多,此回收器越好用

(3)parille scavege垃圾回收器(並行收集器):

                                                               1)運用演算法:複製演算法

                                                               2)它關注的是系統吞吐量,系統吞吐量 = 執行使用者                                                                       程式時間/(執行使用者時間+JVM執行時間),開                                                                       發Java桌面級 應用,大量科學計算用它比較好。

(4)CMS(counConrrent make sweep併發收集器):

                                                               1)併發與並行的區別是,併發是使用者工作執行緒與                                                                          JVM執行緒同時執行(實質上也是交替進行,因為                                                                        CPU的排程機制),而並行不包含使用者工作線                                                                            程。

                                                               2)運用演算法:標記整理演算法

(5)seral Old垃圾回收器(序列收集器):

                                                                1)運用演算法:標記整理演算法

                                                               2)缺點:工作時候使用者程式停止。

(6)parille Old垃圾回收器(並行收集器):

                                                                1)運用演算法:標記整理演算法

                                                               2)缺點:工作時候使用者程式停止,但是比使用seral                                                                      Old垃圾回收器停止時間短。

(7)G1垃圾回收器(Gebarge first)

                                                                1)運用演算法:標記清除演算法

3.新生代及老年代垃圾回收器匹配關係

1.CMS垃圾回收器可以和所有新生代的垃圾回收器配合工作

2.seral Old垃圾回收器可以和所有新生代的垃圾回收器配合工作

3.parille Old垃圾回收器只能和parille scavege垃圾回收器配合工作

4.G1垃圾回收器能和所有新生代及老年代的垃圾回收器配合工作,甚至新生代及老年代都是它也可以

結語:這篇文章只是對JVM的大致講解。講解顆粒度還能更細,然後還有對JVM的引數講解及JAVA提供的對JVM使用的小工具有時間我再寫一篇部落格。有疑問的可以加我QQ 1374487940,請做好備註

 

 

相關文章