在很久很久以前,也就是1992年3月份,有一所NB轟轟的咖啡學校誕生了,它的名字叫JAVA,學校的校規極其的厲害,普通學生聞風喪膽,唯一尖子生般的人才能留下來,別猜了那人就是 "你"。
本色出演名單
姓名別名簡稱學校Java Virtual MachineJVM教室堆空間Heap老師垃圾回收器Minor GC / Major GC學生數據Object
學校平面圖
俗名使用權限簡稱 Eden教室新生EdenSurvivor0/1教室優等生S0、S1Tenured/Old Generation教室尖子生專用OldMetaspace教室學生會,校長專用Metaspace
學校歡迎新生板報
- 新生領取作業記錄本。備註:(記錄學生是否做了作業,每做一次蓋一個章)。
- 接著新生自行移步到 Eden 教室。
- Minor GC老師會不斷抽查有沒有做作業、沒做的將被老師進行標記。
- 沒被標記的成為優等生,自行移步到 S0 或 S1 教室,備註:(這兩個教室必需有個是空的,學生不能直接進入空教室,空教室由Minor GC老師負責安排進入),移步完後開除 Eden 教室的差生。
- 這兩個教室Minor GC老師會不斷抽查,做了作業的在老師點名後移步另一個教室按順序坐好,沒有做作業的學生留下來,學校做思想教育後然後開除。
- Minor GC老師每抽查一次作業,會給你們加一分,如果分數達到指定分數,你們可以進入尖子生 Old 教室了。
- S0或S1教室人滿後,恭喜你們這批人可以混成為尖子生,可移步到 Old 教室,這裡會有另外的Major GC老師負責抽查,沒Minor GC老師管那麼嚴,開心吧。
- 如果學生的作業記錄本已經記錄滿了,很不好意思,也會被開除,因為我們學校閒麻煩,懶得再給你們發作業記錄本。
- Metaspace教室,如果你跟校長或者學生會有點關係就進去,不用擔心被開除,哈哈。
學校歡迎新生板報內幕
用來記錄創建對象的 GC年齡,每 GC 一次後還存活的加一歲。
所有新創建的對象都會在 Eden 區域中。
Minor GC 會檢查對象是否還被引用,沒有則進行標記。
執行Minor GC後,在Eden中存活的對象會被移動到S0或S1區域。
移動完後,Minor GC將Eden區域進行清空,並將存活的對象年齡值加1。
第二次Minor GC,重複執行 ( 3 , 4 ) 步驟,這時候另一個S1區域要派上用場了。
清空
再來執行一次Minor GC看看效果圖。
清空
假設系統設置的年老代齡值為4年,那麼3號數據就可以升級到年老代區域中了。
清空
Survivor區域滿後直接轉移到Tenrued/Old Generation,下面這種情況就是了,Survivor區域裡面的對象都存活,空間又不夠存放了。
清空後的數據
假設系統設置的年老代齡值為20次,那麼,第二十次後,將會被清除Major GC會自動進行處理,進行標記。
清除
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內容還有非常之多,這裡只是冰山一角。
最後
每天發佈更多新鮮有含量的技術文章、總有一款適合你。
快關注我、把我打包帶走、每天提醒你學習一手技術。
閱讀更多 IT實戰聯盟 的文章