GC淺談(三)

人生并不像火車要通過每個站似的經(jīng)過每一個生活階段师骗。人生總是直向前行走,從不留下什么降狠。 —— 劉易斯

GC日志理解

每一種收集器的日志格式都可以不一樣的轴术。 以下是兩段典型的GC日志:

0.173: [GC 0.173: [DefNew: 1353K->582K(19008K), 0.0015600 secs]0.175: [Tenured: 0K->581K(42368K), 0.0027216 secs] 1353K->581K(61376K), [Metaspace: 2551K->2551K(1056768K)], 0.0043860 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
0.275: [Full GC (System.gc()) 0.275: [Tenured: 205381K->205382K(247172K), 0.0035190 secs] 205722K->205382K(266308K), [Metaspace: 2551K->2551K(1056768K)], 0.0041874 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

最前面的數(shù)字"0.173"和"0.275"代表了GC發(fā)生的時間劫流,這個數(shù)字的含義是從JVM啟動以來經(jīng)過的秒數(shù)巫玻。
??GC日志開頭的“[GC”和“[Full GC”說明了這次垃圾收集的停頓類型。如果有Full祠汇,說明這次GC是發(fā)生了Stop the world的仍秤。如果是調(diào)用System.gc(),則是顯示“[Full GC (System.gc())”。
??“[DefNew”可很、“[Tenured”诗力、“Perm”(JDK1.7及以下)、“[Metaspace”(jdk1.8)表示發(fā)生GC的區(qū)域我抠。上面示例中使用的Serial收集器中的新生代名為“Default New Generation”苇本,所以顯示“[DefNew”。如果是ParNew收集器菜拓,新生代名稱就會變?yōu)椤癙arNew”瓣窄,意為“Parallel New Genaration”。如果采用Parallel Scavenge收集器纳鼎,那新生代名稱就會變?yōu)椤癙SYoungGen”俺夕。老年代和永久代同理。
??“1353K->582K(19008K)”表示“GC前該內(nèi)存區(qū)域已使用容量->GC后該內(nèi)存區(qū)域已使用容量(該內(nèi)存區(qū)域總?cè)萘?”贱鄙,方括號外部的“1353K->581K(61376K)”表示“GC前JAVA堆已使用容量->GC后JAVA堆已使用容量(JAVA堆總?cè)萘?”劝贸。
??“0.0015600 secs”表示該內(nèi)存區(qū)域GC所占用的時間,單位是秒贰逾⌒伲“[Times: user=0.00 sys=0.00, real=0.00 secs]”分別代表用戶態(tài)消耗的CPU時間、內(nèi)核態(tài)消耗的CPU時間和操作從開始到結束的墻鐘時間疙剑。CPU時間和墻鐘時間的區(qū)別是墻鐘時間包括各種非運算的等待耗時,如等待磁盤IO践叠、等待線程阻塞等言缤,而CPU時間不包括這些耗時。

JVM的GC日志的主要參數(shù)

-XX:+PrintGC 輸出GC日志
-XX:+PrintGCDetails 輸出GC的詳細日志
-XX:+PrintGCTimeStamps 輸出GC的時間戳(以基準時間的形式)
-XX:+PrintGCDateStamps 輸出GC的時間戳(以日期的形式禁灼,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在進行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的輸出路徑

GC類型

在HotSpot中管挟,GC分為兩大種類:

  • Partial GC: 不收集整個堆得GC
    ??Young GC: 只收集young gen的GC。
    ??Old GC:只收集old gen的GC弄捕。只有CMS的concurrent collection是這個模式僻孝。
    ??Mixed GC:收集young gen和部分old gen的GC导帝,只有G1有這個模式。
  • Full GC:收集整個堆穿铆,包括young gen您单、old gen、perm gen(如果存在的話)等區(qū)域荞雏。

PS: Major GC通常是跟full GC是等價的虐秦,收集整個GC堆。

GC的觸發(fā)條件

  • Young GC:當young gen中的eden區(qū)分配滿的時候觸發(fā)凤优。
  • Full GC
    ??① 當準備要觸發(fā)一次young GC時悦陋,如果發(fā)現(xiàn)統(tǒng)計數(shù)據(jù)說之前young GC的平均晉升大小比目前old gen剩余的空間大,則不會執(zhí)行Young GC而是轉(zhuǎn)為執(zhí)行Full GC(因為HotSpot VM的GC里筑辨,除了CMS的concurrent collection之外俺驶,其它能收集old gen的GC都會同時收集整個GC堆,包括young gen棍辕,所以不需要事先觸發(fā)一次單獨的young GC)暮现。
    ??② 如果有perm gen的話,在perm gen上分配空間且沒有足夠空間時痢毒,也要觸發(fā)Full GC送矩。
    ??③ System.gc(),顯示的調(diào)用GC哪替,也會觸發(fā)Full GC栋荸。
    ??④ Old gen空間不足:當創(chuàng)建一個大對象、大數(shù)組時凭舶,eden 區(qū)不足以分配這么大的空間晌块,會嘗試在old gen 中分配,如果這時 old gen 空間也不足時帅霜,會觸發(fā) full gc匆背。
    ??⑤ ygc出現(xiàn) promotion failure(晉升失敗):promotion failure 發(fā)生在 young gc 階段身冀,即 cms 的 ParNewGC钝尸,當對象的gc年齡達到閾值時,或者 eden 的 to 區(qū)放不下時搂根,會把該對象復制到 old gen珍促,如果 old gen 空間不足時,會發(fā)生 promotion failure剩愧,并接下去觸發(fā)full gc猪叙。

finalize詳解

對象object重寫了finalize()方法,且還未執(zhí)行過,那么object會被插入到F-Queue隊列中穴翩,由一個虛擬機自動創(chuàng)建的犬第、低優(yōu)先級的Finalizer線程觸發(fā)其finalize()方法。finalize()方法是對象逃脫死亡的最后機會芒帕,GC會對隊列中的對象進行第二次標記歉嗓。如果object在finalize()方法中與引用鏈上的任何一個對象建立聯(lián)系,那么在第二次標記時副签,object會被移出“即將回收”集合.
??finalize只會被執(zhí)行一次遥椿,下面通過例子來說明下finalize。

public class FinalizeTest {

    public static FinalizeTest object;
    byte[] _200M = new byte[200 * 1024 * 1024];

    public void isAlive() {
        System.out.println("I'm alive");
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("method finalize is running");
        object = this; 
    }

    public static void main(String[] args) throws InterruptedException {
        object = new FinalizeTest();

        object = null;
        System.gc();

        Thread.sleep(500);
        if (object != null) {
            object.isAlive();
        } else {
            System.out.println("I'm dead");
        }
        object = null;
        System.gc();

        Thread.sleep(500);
        if (object != null) {
            object.isAlive();
        } else {
            System.out.println("I'm dead");
        }
    }
}

執(zhí)行程序后淆储,程序輸出結果:

method finalize is running
I'm alive
I'm dead

第一次GC時冠场,因在finalize方法中,將當前對象賦值給了object本砰,因此第一次未被回收碴裙。而第二次GC時,由于finalize方法已經(jīng)執(zhí)行過了点额,因finalize方法只會被JVM調(diào)用一次舔株,所以第二次GC時,object被回收了还棱。

參考資料
Major GC和Full GC的區(qū)別是什么载慈?觸發(fā)條件呢?
雜談GC
《深入理解JAVA虛擬機》

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末珍手,一起剝皮案震驚了整個濱河市办铡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琳要,老刑警劉巖寡具,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異稚补,居然都是意外死亡童叠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門课幕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厦坛,“玉大人,你說我怎么就攤上這事乍惊》喟悖” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵污桦,是天一觀的道長。 經(jīng)常有香客問我匙监,道長凡橱,這世上最難降的妖魔是什么小作? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮稼钩,結果婚禮上顾稀,老公的妹妹穿的比我還像新娘。我一直安慰自己坝撑,他們只是感情好静秆,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巡李,像睡著了一般抚笔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侨拦,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天殊橙,我揣著相機與錄音,去河邊找鬼狱从。 笑死膨蛮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的季研。 我是一名探鬼主播铲汪,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼摘悴!你這毒婦竟也來了康二?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤递沪,失蹤者是張志新(化名)和其女友劉穎豺鼻,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體款慨,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡儒飒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了檩奠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桩了。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖埠戳,靈堂內(nèi)的尸體忽然破棺而出井誉,到底是詐尸還是另有隱情,我是刑警寧澤整胃,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布颗圣,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏在岂。R本人自食惡果不足惜奔则,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔽午。 院中可真熱鬧易茬,春花似錦、人聲如沸及老。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骄恶。三九已至食铐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叠蝇,已是汗流浹背璃岳。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悔捶,地道東北人铃慷。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蜕该,于是被迫代替她去往敵國和親犁柜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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

  • 原文閱讀 前言 這段時間懈怠了堂淡,罪過馋缅! 最近看到有同事也開始用上了微信公眾號寫博客了,挺好的~給他們點贊绢淀,這博客我...
    碼農(nóng)戲碼閱讀 5,970評論 2 31
  • 作者:一字馬胡 轉(zhuǎn)載標志 【2017-11-12】 更新日志 日期更新內(nèi)容備注 2017-11-12新建文章初版 ...
    beneke閱讀 2,205評論 0 7
  • 簡書 占小狼轉(zhuǎn)載請注明原創(chuàng)出處萤悴,謝謝 上周有幸給部門的小伙伴分享了一些JVM相關的知識,在整個做PPT的過程中皆的,也...
    美團Java閱讀 8,250評論 19 76
  • GC整理 GC分類在Hotspot VM實現(xiàn)中覆履,主要有兩大類GCPartial GCyoung gc:只收集 yo...
    andersonoy閱讀 399評論 0 1
  • 如果,有一種治療方法费薄,我愿傾盡所有硝全,我愿銼皮削骨,去彌補你們所認為我犯下的錯楞抡。 身為同性戀伟众,我并不知道為何如此,是...
    嘿孤獨患者閱讀 372評論 0 1