本篇內(nèi)容介紹了“什么是三色標記”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比賀蘭網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式賀蘭網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋賀蘭地區(qū)。費用合理售后完善,十年實體公司更值得信賴。
前幾天,公司臨時派我去面試一個java實習生,由于沒有這方面的任何經(jīng)驗,于是一不小心,我就問超綱了。
問過了java基礎,我隨口又問了一句,知道三色標記嗎?
他顯然是懵逼了一瞬間,但也僅僅一瞬間,然后振振有詞地反問,是紅黃藍三色標記嗎?
這倒是反把我問住了。
面試有問題答不出來,這其實可以理解,不懂就說不懂,不會就說不會,子曾經(jīng)曰過,知之為知之。
三色標記,正經(jīng)來說,就只有黑白灰三個顏色。
但實際上,三色標記,和顏色其實沒有任何關(guān)系,只與一次掃描狀態(tài)相關(guān)。
黑色節(jié)點,代表根節(jié)點或者已掃描完的節(jié)點,該節(jié)點的子節(jié)點也被掃描完;
灰色節(jié)點,代表已掃描完的節(jié)點,該節(jié)點的子節(jié)點存在未被掃描的情況;
白色節(jié)點,代表未被掃描的節(jié)點。
上圖中,A就是黑色節(jié)點,B為灰色,因為B的子節(jié)點C未被掃描,C則是白色節(jié)點。
如果,掃描結(jié)束,C依舊是白色,則C被回收。
但這里會存在一個問題,如果在上圖的情況下,BC的引用斷掉,而AC的引用被建立,如下圖:
則會出現(xiàn)以下情況:
B掃描完,無引用,變黑。
C,按道理說,也會變灰,然后變黑。
但A此時已經(jīng)是黑色節(jié)點,則不會掃描其引用,所以C不會被掃描,還是白色。
最后,C會被當垃圾回收。
這顯然是一個誤操作,因為C當前是根可達的,那該問題怎么辦呢?
常用的垃圾回收器,CMS和G1都給出了解決方案。
CMS的方法叫做Incremental Update算法。
該算法從結(jié)果入手,判斷掃描完結(jié)時,是否有白色對象被黑色對象引用,如果被引用,則通過write barrier寫屏障技術(shù),把黑色的對象重新標記為灰色,然后重新掃描。
G1的方法叫做SATB算法。
該算法從源頭入手,GC開始之前拍攝快照,設定所有存在引用的對象,都是存活的。
GC掃描之后,再次拍攝快照,將新引用的存活對象標記。
然后將快照疊加。
這樣,C顯示的是被A,B兩個對象引用。
但這樣會有一個弊端,如果此時,AC之間的引用沒有被建立,則C本來應該被回收,但此輪卻并沒有被回收。
跨代引用這個概念被提出來的時候,很多人都有似曾相識的感覺。但具體要說,很多人就說不出所以然來了。
其實,java堆說到底就兩個代(年輕代和老年代),持久代在jdk的某個版本后,就被放到本地方法棧了。
跨代引用,即父節(jié)點在一個代,而引用對象在另一個代。
一般來說,父節(jié)點都在老年代,引用對象在年輕代。
如上圖,X引用和Y引用都是屬于跨代引用。
跨代引用一般多發(fā)生在G1回收器中,因為G1的內(nèi)存采用分塊的模式,內(nèi)存區(qū)域不穩(wěn)定。
那么,年輕代回收(young GC)時,是否要根據(jù)可達性分析,遍歷所有的老年代關(guān)聯(lián),直到根節(jié)點呢。
不需要。
只要父節(jié)點在老年代,則一律視為根節(jié)點。
在這里(跨代引用)要引入兩個概念,結(jié)果集和卡表。卡表可以看作一個老年代分區(qū)的集合或者數(shù)組,如下圖。
結(jié)果集,就是一組類似于map的容器,key存放卡表的下標,value存放引用關(guān)系
想想這樣做的好處是什么?
java工作線程和垃圾回收線程,一般情況下,是不能同時進行的。
通常老師講到這個問題的時候,會打個比方:吃飯和洗碗擦桌子。
之所以工作線程和垃圾回收線程不能同時進行,是因為人不能一邊吃飯一邊收拾碗筷(觸手怪除外)。
同理,還有一個問題,你也不能把飯吃到一半,把碗拿過去洗。
所以,你必須在吃完飯的時候,洗碗。
吃完飯的這個時間,就是安全點。
一般來說,安全點是某個線程的結(jié)束或者中斷的時間,可以是方法調(diào)用,循環(huán)跳轉(zhuǎn),異常跳轉(zhuǎn)等。
再回頭說說垃圾回收的全過程。
業(yè)務線程執(zhí)行過程中,會不斷輪詢一個標志位,該標志位處于垃圾回收線程中;
如果需要做垃圾回收,回收線程會將標志位改掉;
業(yè)務線程收到標志位信息,會走到安全點,然后停止;
垃圾回收線程啟動,回收垃圾。
那么,安全區(qū)域是什么呢?
一個區(qū)域所有的點都是安全點,這一部分就是安全區(qū)域。
還是拿原來那個例子,如果你晚上減肥,不想吃飯,碗什么的,隨時都可以洗。
直接上命令:-XX+PrintGCDetails。
該命令可以在控制臺打印GC日志。
日志內(nèi)容如下:
吞吐量:指在應用程序的生命周期內(nèi),應用程序所花費的時間和系統(tǒng)總運行時間的比值。
公式:吞吐量=系統(tǒng)應用時間/系統(tǒng)總運行時間
垃圾回收器負載:和吞吐量正好相反,垃圾回收器負載指垃圾回收器耗時與系統(tǒng)運行總時間的比值。
公式:吞吐量=垃圾回收時間/系統(tǒng)總運行時間
停頓時間(延遲):指垃圾回收器正在運行時,應用程序的暫停時間。
PS:獨占回收器延遲長,但吞吐量高,并發(fā)回收器,延遲少,但吞吐量低。
垃圾回收頻率:指垃圾回收器多長時間會運行一次。
PS:垃圾回收器的頻率應該是越低越好。
反應時間:指當一個對象被稱為垃圾后多長時間內(nèi),它所占據(jù)的內(nèi)存空間會被釋放。
PS:即垃圾回收的周期
over~~
堆分配:不同的垃圾回收器對堆內(nèi)存的分配方式可能是不同的。一個良好的垃圾收集器應該有一個合理的堆內(nèi)存區(qū)間劃分。
“什么是三色標記”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
網(wǎng)站名稱:什么是三色標記
網(wǎng)站路徑:http://chinadenli.net/article28/gjsscp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、電子商務、網(wǎng)站導航、網(wǎng)站收錄、云服務器、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)