探究執(zhí)行System.gc()以及finalize對于垃圾回收的影響

System.gc()

在默認情況下坊谁,執(zhí)行System.gc()會顯示的觸發(fā)FullGC锣披,同時對新生代以及老年大產(chǎn)生影響,進行回收糙申。
其實在正常情況下叨叙,垃圾回收都是自動進行的锭弊,無需人為主動觸發(fā),因為頻繁的觸發(fā)垃圾回收對整體系統(tǒng)來說時沒有好處的擂错,因此虛擬機會提供一個參數(shù)DisableExceptionGC來控制是否手工觸發(fā)GC的味滞。

我們可以看以下具體的實現(xiàn):

Runtime.getRuntime().gc();

內(nèi)部是一個native方法:

public native void gc();

我們可以看下C++源碼:

image

可以看到,其實是通過判斷DisableExplicitGC這個參數(shù)去判斷是否進行垃圾回收的钮呀,所以我們可以i設(shè)置: -XX:-+DisableExplicitGC,條件判斷就無法成立剑鞍,那么就會用顯示GC,使得System.gc等價于一個空函數(shù)調(diào)用行楞。

同時攒暇,當(dāng)我們使用System.gc的時候,如果垃圾回收器是CMS或者G1的話子房,默認是不會執(zhí)行并發(fā)的方式進行回收的,這時候我們需要打開虛擬機參數(shù):

-xx:+ExplicitGCInvokesConcurrent 該參數(shù)就轧,可以在使用CMS或者G1時证杭,如果觸發(fā)system.gc,會并發(fā)的執(zhí)行垃圾回收。

finalize對于垃圾回收的影響

在java中提供了一個類似C++析構(gòu)函數(shù)的機制===finalize

protected void finalize() throws Throwable { }

可以看到妒御,該方法設(shè)置成protected解愤,可以用于子類重寫,用于在對象倍回收時進行資源的釋放乎莉。

在目前送讲,普遍的認識是盡量不要使用finalize函數(shù)進行資源釋放,原因如下:

1.在finalize時可能會導(dǎo)致對象復(fù)活惋啃,在finalize函數(shù)執(zhí)行之前哼鬓,可能在系統(tǒng)中對象的引用已經(jīng)倍清楚了,但是作為實例方法finalize边灭,對象的this引用依然會被傳入方法內(nèi)部异希,如果引用外泄,對象就會復(fù)活绒瘦,此時對象又會變成可觸及狀態(tài)称簿。

2.finalize的執(zhí)行時間是不能保證的扣癣,完全由gc線程決定,因此極端情況下憨降,若不發(fā)生gc父虑,則將沒有己會執(zhí)行。推薦在try catch finally中釋放授药。

函數(shù)finalize是由FinalizerThread線程處理的频轿,每一個即將被回收的并且包含有finalize方法的對象都會在正式回收前加入FinalizerThread的執(zhí)行隊列,該隊列是引用隊列烁焙,內(nèi)部實現(xiàn)為鏈表結(jié)構(gòu)航邢。


image

Finalizer內(nèi)部封裝了實際的回收對象,referent字段則指向?qū)嶋H的對象引用骄蝇。


image

由于對象在回收之前被Finalizer的referent字段進行強引用膳殷,并加入了FinalizerThread的執(zhí)行隊列,這意味著對象又變?yōu)榭蛇_性對象九火,因此阻止了對象的正匙裕回收。

由于在引用對象中的元素排隊執(zhí)行finalize方法岔激,一旦出現(xiàn)性能問題勒极,將導(dǎo)致這些垃圾對象長時間堆積在內(nèi)存中,可能導(dǎo)致OOM異常虑鼎。

image

部分取材自: 《實戰(zhàn)java虛擬機》
《深入理解jvm虛擬機》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辱匿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子炫彩,更是在濱河造成了極大的恐慌匾七,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件江兢,死亡現(xiàn)場離奇詭異昨忆,居然都是意外死亡,警方通過查閱死者的電腦和手機杉允,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門邑贴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叔磷,你說我怎么就攤上這事拢驾。” “怎么了世澜?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵独旷,是天一觀的道長。 經(jīng)常有香客問我,道長嵌洼,這世上最難降的妖魔是什么案疲? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮麻养,結(jié)果婚禮上褐啡,老公的妹妹穿的比我還像新娘。我一直安慰自己鳖昌,他們只是感情好备畦,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著许昨,像睡著了一般懂盐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上糕档,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天莉恼,我揣著相機與錄音,去河邊找鬼速那。 笑死俐银,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的端仰。 我是一名探鬼主播捶惜,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼荔烧!你這毒婦竟也來了吱七?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤茴晋,失蹤者是張志新(化名)和其女友劉穎陪捷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诺擅,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年啡直,在試婚紗的時候發(fā)現(xiàn)自己被綠了烁涌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡酒觅,死狀恐怖撮执,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舷丹,我是刑警寧澤抒钱,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響谋币,放射性物質(zhì)發(fā)生泄漏仗扬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一蕾额、第九天 我趴在偏房一處隱蔽的房頂上張望早芭。 院中可真熱鬧,春花似錦诅蝶、人聲如沸退个。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽语盈。三九已至,卻和暖如春缰泡,著一層夾襖步出監(jiān)牢的瞬間刀荒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工匀谣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留照棋,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓武翎,卻偏偏與公主長得像烈炭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宝恶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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