圖解原理

在很久很久以前,也就是1992年3月份,有一所NB轟轟的咖啡學校誕生了,它的名字叫JAVA,學校的校規極其的厲害,普通學生聞風喪膽,唯一尖子生般的人才能留下來,別猜了那人就是 "你"。

JVM - 圖解原理

本色出演名單

JVM - 圖解原理

姓名別名簡稱學校Java Virtual MachineJVM教室堆空間Heap老師垃圾回收器Minor GC / Major GC學生數據Object

學校平面圖


JVM - 圖解原理


俗名使用權限簡稱

Eden教室新生EdenSurvivor0/1教室優等生S0、S1Tenured/Old Generation教室尖子生專用OldMetaspace教室學生會,校長專用Metaspace

學校歡迎新生板報

  1. 新生領取作業記錄本。備註:(記錄學生是否做了作業,每做一次蓋一個章)。
  2. 接著新生自行移步到 Eden 教室。
  3. Minor GC老師會不斷抽查有沒有做作業、沒做的將被老師進行標記。
  4. 沒被標記的成為優等生,自行移步到 S0 或 S1 教室,備註:(這兩個教室必需有個是空的,學生不能直接進入空教室,空教室由Minor GC老師負責安排進入),移步完後開除 Eden 教室的差生。
  5. 這兩個教室Minor GC老師會不斷抽查,做了作業的在老師點名後移步另一個教室按順序坐好,沒有做作業的學生留下來,學校做思想教育後然後開除。
  6. Minor GC老師每抽查一次作業,會給你們加一分,如果分數達到指定分數,你們可以進入尖子生 Old 教室了。
  7. S0或S1教室人滿後,恭喜你們這批人可以混成為尖子生,可移步到 Old 教室,這裡會有另外的Major GC老師負責抽查,沒Minor GC老師管那麼嚴,開心吧。
  8. 如果學生的作業記錄本已經記錄滿了,很不好意思,也會被開除,因為我們學校閒麻煩,懶得再給你們發作業記錄本。
  9. Metaspace教室,如果你跟校長或者學生會有點關係就進去,不用擔心被開除,哈哈。

學校歡迎新生板報內幕

用來記錄創建對象的 GC年齡,每 GC 一次後還存活的加一歲。

所有新創建的對象都會在 Eden 區域中。


JVM - 圖解原理


Minor GC 會檢查對象是否還被引用,沒有則進行標記。


JVM - 圖解原理


執行Minor GC後,在Eden中存活的對象會被移動到S0或S1區域。


JVM - 圖解原理


移動完後,Minor GC將Eden區域進行清空,並將存活的對象年齡值加1。


JVM - 圖解原理


第二次Minor GC,重複執行 ( 3 , 4 ) 步驟,這時候另一個S1區域要派上用場了。


JVM - 圖解原理


清空


JVM - 圖解原理


再來執行一次Minor GC看看效果圖。


JVM - 圖解原理


清空


JVM - 圖解原理


假設系統設置的年老代齡值為4年,那麼3號數據就可以升級到年老代區域中了。


JVM - 圖解原理


清空


JVM - 圖解原理


Survivor區域滿後直接轉移到Tenrued/Old Generation,下面這種情況就是了,Survivor區域裡面的對象都存活,空間又不夠存放了。


JVM - 圖解原理


清空後的數據


JVM - 圖解原理


假設系統設置的年老代齡值為20次,那麼,第二十次後,將會被清除Major GC會自動進行處理,進行標記。


JVM - 圖解原理


清除


JVM - 圖解原理


Metaspace區域,屬於GC Roots。

虛擬機棧(棧幀中的本地變量表)中引用的對象。
方法區中類靜態屬性引用的對象。

方法區中常量引用的對象。
本地方法棧中JNI(即一般說的Native方法)引用的對象。

如果Old Generation也滿了,就會報大家經常看到的OOM異常了。

現實例子

1.張三李四同學第一天來到這所JVM學校

# 教室裡只有他們兩人
Object zhangsan = new Object();
Object lisi = new Object();

2.可愛的老師說找出會做這道題目的學生

# zhangsan說我會,然後
zhangsan.do();
  • 這時候Minor GC的老師出現了。
# 發現lisi在那裡傻傻的發呆,不會做作業就會看
# GC老師直接標記它為沒用之人,zhangsan標記為有用之才。
  • Minor GC老師執行家法
# 告訴zhangsan去隔壁的`S0`教室繼續做題
# 拿出化骨水化掉了lisi

3.zhangsan來到了S0教室

# 教室越來越多人,已經擠不進人了
# Minor GC老師又給沒用的人進行標記,他又成功躲過了這次
# 老師告訴他去`S1`教室繼續做題,他要化人了

4.zhangsan來到了S1教室

# 經過了幾輪的S0/S1教室來回跑,他已經躲過了15次了
# `Minor GC`老師告訴他,你可以去尖子班做題了

5.zhangsan來到了Tenrued/Old Generation教室,這裡的Major GC老師果然不經常來看我們了。

# zhangsan在這裡又避免了5次的化骨水,但時間卻花了比之前的幾十倍
# 最後zhangsan還是被化掉了,因為前後加起來、太老了,傷不起。

ZhangSan GameOver 全劇終

PS備註:此文屬於簡單JVM知識圖解,便於理解,但JVM內容還有非常之多,這裡只是冰山一角。


最後

每天發佈更多新鮮有含量的技術文章、總有一款適合你。

快關注我、把我打包帶走、每天提醒你學習一手技術。


分享到:


相關文章: