前言
今天同學在課前演講,大緻講了一下java虛拟機,講的很快也很淺,反正聽的迷迷糊糊的,自己下來從新進行查找資料進行整理學習,先将JVM裡面的垃圾回收機制中算法進行歸攏,整理如下,如有錯誤或不足請留言或私信告知,定會改正!
垃圾回收機制圖
垃圾對象判定标準
JVM的GC工作主要針對的對象是堆記憶體,在做GC工作之前,首先要判定堆記憶體中的對象執行個體是否為垃圾,通常使用以下兩種算法來定義
1.引用計數算法
java在運作時,當有一個地方引用該對象執行個體,會将這個對象執行個體加1,引用失效時就減1,jvm在掃描記憶體時,發現引用計數值為0的則是垃圾對象,計數值大于0的則為活躍對象。
目前垃圾回收算法,沒有采用引用計數算法,原因是在對象互相引用的情況下,無法判定兩者是否為垃圾對象。
2.根搜尋算法
根搜尋算法是以“GC ROOTS”為起始點往下搜尋,所有經過的對象合并起來稱為引用鍊,在這引用鍊裡,沒有的對象稱為垃圾對象,(實際上jvm還做了一個篩選動作,判定目前對象是否執行finalize()方法,如果不需要執行才判定為垃圾對象,這裡不做介紹),在引用鍊裡的是活躍對象。那什麼樣的對象才能稱為“GC ROOTS”呢?以下四種可以
- 虛拟機棧(棧幀中的本地變量表)中引用的對象。
- 方法區中的類靜态屬性引用的對象。
- 方法區中的常量引用的對象。
- 本地方法棧中 JNI(Native 方法)的引用對象。
垃圾回收算法
1. 标記-清除(Mark-Sweep)

JVM會掃描所有的對象執行個體,通過根搜尋算法,将活躍對象進行标記,jvm再一次掃描所有對象,将未标記的對象進行清除,隻有清除動作,不作任何的處理,這樣導緻的結果會存在很多的記憶體碎片。
2. 複制(copying)
JVM掃描所有對象,通過根搜尋算法标記被引用的對象,之後會申請新的記憶體空間,将标記的對象複制到新的記憶體空間裡,存活的對象複制完,會清空原來的記憶體空間,将新的記憶體最為JVM的對象存儲空間。這樣雖然解決了記憶體記憶體碎片問題,但是如果對象很多,重新申請新的記憶體空間會很大,在記憶體不足的場景下,會對JVM運作造成很大的影響
3. 标記-整理(Mark-compact)
4. 分代回收
結束語