3.JVM對象存活判定算法

1.概述

最近通過看書系統(tǒng)的了解了JVM的GC原理,發(fā)現(xiàn)之前自己很多地方理解有偏差,不夠詳細舔箭。之前寫過一篇JVM垃圾回收機制的文章,寫的太亂了不想再后面加了案糙,所以重開一篇限嫌。這篇文章主要介紹基本概念和JVM的對象存活判定

1.1 什么是垃圾回收

JVM會自動給我們分配內(nèi)存和釋放內(nèi)存时捌,簡單來說怒医,jvm釋放內(nèi)存的過程就是垃圾回收。這里需要注意的是:JVM回收的是“垃圾”對象所占用的內(nèi)存奢讨。

1.2 為什么要進行垃圾回收

  • 避免內(nèi)存溢出稚叹、內(nèi)存泄漏
  • 合理利用內(nèi)存,防止垃圾對象占用內(nèi)存

1.3 學習垃圾回收機制的意義

當需要排查各種內(nèi)存溢出拿诸、內(nèi)存泄漏問題時扒袖,當垃圾收集成為系統(tǒng)達到更高并發(fā)量的瓶頸時,我們就需要對這些“自動化”的技術實施必要的監(jiān)控和調(diào)節(jié)亩码。


2.對象存活判定

2.1 判定方法

2.1.1 引用計數(shù)法

原理

給對象添加一個引用計數(shù)器季率,當有一個地方引用該對象時,計數(shù)器值加一描沟;當引用失效時飒泻,計數(shù)器值就減一。當計數(shù)器為零時吏廉,表示該對象沒有在任何地方被引用泞遗,則該對象可以判定為可回收對象。

缺陷

無法解決循環(huán)引用的問題席覆。當兩個對象互相引用時史辙,則永遠不會被回收。

2.1.2 可達性算法

在主流語言的主流實現(xiàn)中佩伤,都是通過可達性算法來判定對象是否存活聊倔。

原理

以被稱為“GC Roots”的對象為起點,從這些節(jié)點向下搜索畦戒,搜索的路徑被稱為引用鏈方库。當對象沒有任何的引用鏈與“GC ROOTS”相連,則該對象則被判定為可回收對象障斋。
如圖,對象object 5、object 6垃环、object 7雖然互相有關聯(lián)邀层,但是它們到GC Roots是不可達的,所以它們將會被判定為是可回收的對象遂庄。

可達性算法判定對象是否可回收.png

GC Roots

在java語言中寥院,可作為GC Roots的對象包括下面幾種:

  • 虛擬機棧(棧幀中的本地變量表)中引用的對象
  • 方法區(qū)中類靜態(tài)屬性引用的對象
  • 方法區(qū)中常量引用的對象
  • 本地方法棧中JNI(即一般說的Native方法)引用的對象

3.對象引用

從上面的判定算法可以看出,我們看重的是對象引用涛目。實際上在JVM中秸谢,對象引用不僅僅是有或無兩種形式。無論是哪種判定對象存活的方法霹肝,根本是在判定“引用”是否存在估蹄。java有四種引用:強引用、軟引用沫换、弱引用和虛引用臭蚁。

名稱 定義 回收情況
強引用 一般使用的引用,比如new出來的對象讯赏,即“Object object = new Object()” 在對象沒有被根引用鏈接的時候被回收
軟引用 有用但非必須的對象垮兑,比如一些緩存對象 系統(tǒng)將要發(fā)生內(nèi)存溢出前,才會將這些引用列入回收范圍漱挎,進行一次回收操作系枪。在這次回收之后,系統(tǒng)仍然還沒有足夠的內(nèi)存磕谅,才會拋出內(nèi)存溢出異常
弱引用 用來描述非必須對象私爷,強度低于軟引用 只存活到下一次垃圾回收之前,當垃圾回收開始怜庸,無論內(nèi)存是否足夠当犯,都會回收
虛引用 為一個對象設置虛引用關聯(lián)的唯一目的就是能在這個對象被收集器回收時收到一條系統(tǒng)通知 一個對象有無虛引用割疾,不影響他生存時間嚎卫;通過一個虛引用也無法獲取一個對象實例

4.對象被回收過程

finalize方法中,可將待回收對象賦值給GC Roots可達的對象引用宏榕,從而達到對象再生的目的

對象通過finalize()方法逃脫GC的過程.png

需要注意的是拓诸,任何一個對象的finalize()方法都只會被系統(tǒng)自動調(diào)用一次,如果對象面臨下一次回收麻昼,它的finalize()方法不會被再次執(zhí)行奠支,即對象只能自救一次。

5.方法區(qū)回收

這里說的方法區(qū)抚芦,在hotspot中叫做“永久代”倍谜,java虛擬機規(guī)范中不要求一定要實現(xiàn)方法區(qū)的垃圾回收迈螟。原因主要是由于方法區(qū)回收的性價比太低。

5.1 方法區(qū)垃圾主要內(nèi)容

5.1.1 廢棄常量

以常量池中字面量的回收為例尔崔,假如一個字符串"abc"已經(jīng)進入了常量池中答毫,沒有任何String對象引用常量池中的"abc"常量,也沒有其他地方引用了這個字面量季春,這個"abc"常量就會被系統(tǒng)清理出常量池

5.1.2 無用的類

同時滿足下面三個條件可以回收:

  • 該類所有的實例都已經(jīng)被回收洗搂,即Java堆中不存在該類的任何實例
  • 加載該類的ClassLoader已經(jīng)被回收
  • 該類對應的java.lang.Class對象沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法

需要注意的是载弄,這里說的是“可以回收”耘拇,而不是一定回收。類的回收和對象的回收不一樣的地方就在此宇攻。是否對類進行回收惫叛,HotSpot虛擬機提供了-Xnoclassgc參數(shù)進行控制。
還可以使用-verbose:class以及-XX:+TraceClassLoading尺碰、
-XX:+TraceClassUnLoading查看類加載和卸載信息挣棕,其中-verbose:class和-XX:+TraceClassLoading可以在Product版的虛擬機中使用,-XX:+TraceClassUnLoading參數(shù)需要FastDebug版的虛擬機支持亲桥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洛心,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子题篷,更是在濱河造成了極大的恐慌词身,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件番枚,死亡現(xiàn)場離奇詭異法严,居然都是意外死亡,警方通過查閱死者的電腦和手機葫笼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門深啤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人路星,你說我怎么就攤上這事溯街。” “怎么了洋丐?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵呈昔,是天一觀的道長。 經(jīng)常有香客問我友绝,道長堤尾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任迁客,我火速辦了婚禮郭宝,結(jié)果婚禮上辞槐,老公的妹妹穿的比我還像新娘。我一直安慰自己剩蟀,他們只是感情好催蝗,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布切威。 她就那樣靜靜地躺著育特,像睡著了一般。 火紅的嫁衣襯著肌膚如雪先朦。 梳的紋絲不亂的頭發(fā)上缰冤,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音喳魏,去河邊找鬼棉浸。 笑死,一個胖子當著我的面吹牛刺彩,可吹牛的內(nèi)容都是我干的迷郑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼创倔,長吁一口氣:“原來是場噩夢啊……” “哼嗡害!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起畦攘,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤霸妹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后知押,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叹螟,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年台盯,在試婚紗的時候發(fā)現(xiàn)自己被綠了罢绽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡静盅,死狀恐怖良价,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情温亲,我是刑警寧澤棚壁,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站栈虚,受9級特大地震影響袖外,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜魂务,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一曼验、第九天 我趴在偏房一處隱蔽的房頂上張望泌射。 院中可真熱鬧,春花似錦鬓照、人聲如沸熔酷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拒秘。三九已至,卻和暖如春臭猜,著一層夾襖步出監(jiān)牢的瞬間躺酒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工蔑歌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留羹应,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓次屠,卻偏偏與公主長得像园匹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子劫灶,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容