本文分享自華為云社區《從三色標記說開去》,原文作者:java初中生,
【1】關于三色標記
前幾天,公司臨時派我去面試一個java實習生,由于沒有這方面的任何經驗,于是一不小心,我就問超綱了,
問過了java基礎,我隨口又問了一句,知道三色標記嗎?
他顯然是懵逼了一瞬間,但也僅僅一瞬間,然后振振有詞地反問,是紅黃藍三色標記嗎?
這倒是反把我問住了,
面試有問題答不出來,這其實可以理解,不懂就說不懂,不會就說不會,子曾經曰過,知之為知之,
三色標記,正經來說,就只有黑白灰三個顏色,
但實際上,三色標記,和顏色其實沒有任何關系,只與一次掃描狀態相關,
- 黑色節點,代表根節點或者已掃描完的節點,該節點的子節點也被掃描完;
- 灰色節點,代表已掃描完的節點,該節點的子節點存在未被掃描的情況;
- 白色節點,代表未被掃描的節點,

上圖中,A就是黑色節點,B為灰色,因為B的子節點C未被掃描,C則是白色節點,
如果,掃描結束,C依舊是白色,則C被回收,
但這里會存在一個問題,如果在上圖的情況下,BC的參考斷掉,而AC的參考被建立,如下圖:

則會出現以下情況:
- B掃描完,無參考,變黑,
- C,按道理說,也會變灰,然后變黑,
- 但A此時已經是黑色節點,則不會掃描其參考,所以C不會被掃描,還是白色,
- 最后,C會被當垃圾回收,
這顯然是一個誤操作,因為C當前是根可達的,那該問題怎么辦呢?
常用的垃圾回收器,CMS和G1都給出了解決方案,
CMS的方法叫做Incremental Update演算法,
該演算法從結果入手,判斷掃描完結時,是否有白色物件被黑色物件參考,如果被參考,則通過write barrier寫屏障技術,把黑色的物件重新標記為灰色,然后重新掃描,

G1的方法叫做SATB演算法,
該演算法從源頭入手,GC開始之前拍攝快照,設定所有存在參考的物件,都是存活的,
GC掃描之后,再次拍攝快照,將新參考的存活物件標記,
然后將快照疊加,

這樣,C顯示的是被A,B兩個物件參考,
但這樣會有一個弊端,如果此時,AC之間的參考沒有被建立,則C本來應該被回收,但此輪卻并沒有被回收,
【2】跨代參考的問題
跨代參考這個概念被提出來的時候,很多人都有似曾相識的感覺,但具體要說,很多人就說不出所以然來了,
其實,java堆說到底就兩個代(年輕代和老年代),持久代在jdk的某個版本后,就被放到本地方法堆疊了,
跨代參考,即父節點在一個代,而參考物件在另一個代,
一般來說,父節點都在老年代,參考物件在年輕代,

如上圖,X參考和Y參考都是屬于跨代參考,
跨代參考一般多發生在G1回收器中,因為G1的記憶體采用分塊的模式,記憶體區域不穩定,
那么,年輕代回收(young GC)時,是否要根據可達性分析,遍歷所有的老年代關聯,直到根節點呢,
不需要,
只要父節點在老年代,則一律視為根節點,
在這里(跨代參考)要引入兩個概念,結果集和卡表,卡表可以看作一個老年代磁區的集合或者陣列,如下圖,

結果集,就是一組類似于map的容器,key存放卡表的下標,value存放參考關系

想想這樣做的好處是什么?
【3】安全點和安全區域
java作業執行緒和垃圾回收執行緒,一般情況下,是不能同時進行的,
通常老師講到這個問題的時候,會打個比方:吃飯和洗碗擦桌子,
之所以作業執行緒和垃圾回收執行緒不能同時進行,是因為人不能一邊吃飯一邊收拾碗筷(觸手怪除外),
同理,還有一個問題,你也不能把飯吃到一半,把碗拿過去洗,
所以,你必須在吃完飯的時候,洗碗,
吃完飯的這個時間,就是安全點,
一般來說,安全點是某個執行緒的結束或者中斷的時間,可以是方法呼叫,回圈跳轉,例外跳轉等,
再回頭說說垃圾回收的全程序,
- 業務執行緒執行程序中,會不斷輪詢一個標志位,該標志位處于垃圾回收執行緒中;
- 如果需要做垃圾回收,回收執行緒會將標志位改掉;
- 業務執行緒收到標志位資訊,會走到安全點,然后停止;
- 垃圾回收執行緒啟動,回收垃圾,

那么,安全區域是什么呢?
一個區域所有的點都是安全點,這一部分就是安全區域,
還是拿原來那個例子,如果你晚上減肥,不想吃飯,碗什么的,隨時都可以洗,
【4】如何查看GC日志
直接上命令:-XX+PrintGCDetails,
該命令可以在控制臺列印GC日志,
日志內容如下:

【5】終:垃圾回收各指標
吞吐量:指在應用程式的生命周期內,應用程式所花費的時間和系統總運行時間的比值,
公式:吞吐量=系統應用時間/系統總運行時間
垃圾回收器負載:和吞吐量正好相反,垃圾回收器負載指垃圾回收器耗時與系統運行總時間的比值,
公式:吞吐量=垃圾回收時間/系統總運行時間
停頓時間(延遲):指垃圾回收器正在運行時,應用程式的暫停時間,
PS:獨占回收器延遲長,但吞吐量高,并發回收器,延遲少,但吞吐量低,
垃圾回收頻率:指垃圾回收器多長時間會運行一次,
PS:垃圾回收器的頻率應該是越低越好,
反應時間:指當一個物件被稱為垃圾后多長時間內,它所占據的記憶體空間會被釋放,
PS:即垃圾回收的周期
over~~
堆分配:不同的垃圾回收器對堆記憶體的分配方式可能是不同的,一個良好的垃圾收集器應該有一個合理的堆記憶體區間劃分,
本文參考資料:https://blog.csdn.net/xingkongjuhao/article/details/101801460
點擊關注,第一時間了解華為云新鮮技術~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278416.html
標籤:其他
上一篇:滲透測驗思路
