![](http://static.javashuo.com/static/loading.gif)
對象的誕生
「你醒啦!」,迷迷糊糊中聽到一個聲音,我睜開了眼睛,發現一個小夥伴正看着我。程序員
「這裏是哪裏,你是誰啊?」「這裏是堆區,我是一個Ajax對象,叫我小A吧」
我慢慢坐了起來,舉目四望,這裏有好多形形色色的對象居住在這裏,遠處還有好多的線程在各自忙碌着,好一副熱鬧的景象!
「你好,我纔剛醒,我還不知道我是什麼對象呢」「這個簡單,讓我看看哈~~哦,原來你是一個APIController對象啊」,小A摸了摸個人頭。「你怎麼知道的?」
「你的頭上這裏有個64bit的Klass指針,喏,順着這個方向看過去,那裏記錄了你所屬的類信息,你看,那裏寫着APIController呢「
聽他這麼一說,我這才注意到個人頭上有兩個64bit的字段。
「唉,小A,旁邊這個64bit的數字又是裝的什麼內容呢?」
「那個叫MarkWord,是我們Java對象的門面,裏面的信息可重要了,你可要保管好了,這裏面有。。。」
Minor GC
忽然,不知從哪裏傳來一串警報聲,隨後聽到廣播:「各線程注意,請進入安全點等待,各分區注意,啓動一次Minor GC」
聽到廣播的我莫名的緊張起來。
不知怎麼回事,遠處忙碌的線程們都彷彿被施了定身法通常,都停下了手頭的活。只有少數幾個還在活動,這幾個線程大叔看上去跟他們有些不同,其中有幾個朝咱們這邊走了過來。
「這是要幹什麼啊?」我向小A打聽狀況。
「我也不知道,我也比你先出生沒多久,這狀況我也是第一次見到」,小A好像也有一點慌張。
沒過多久,來了一個兇巴巴的管理員線程,拿着喇叭吼着:「
Eden區的對象們聽着,唸到名字的站起來」說完,便開始一個個點名,內心一陣忐忑,怕被叫到,又怕不被叫到。
![](http://static.javashuo.com/static/loading.gif)
唸了好久,終於聽到了小A和個人名字,我倆戰戰兢兢的站了起來。
沒多久就念完了,我一瞅,站起來的是少數啊,內心有點很差的預感。「唸到名字的跟我來,其餘的交給個人助手處理」,說完你們跟着他開始移動。
在走的路上,碰上了另一支隊伍,和咱們匯合了。
「唉,兄弟,怎麼稱呼,大家哪一個單位的?」小A熱情的上去和一個對象攀談了起來。「叫我小B吧,
咱們這波是
Survivor From區的,大家
Eden區來的吧,我半小時前還在大家那兒待過呢」,這個自稱是小B的也很隨和。
「小B哥您好,我們這是要去哪裏啊?」我也上前搭了句話。
「前面是
Survivor To區」
「我們是怎麼被挑出來的?」
「這裏的管理員會經過一種叫
GC Roots的對象,順藤摸瓜,找出全部還有引用關係的對象,我們就是倖存者,說明我們還有價值」
![](http://static.javashuo.com/static/loading.gif)
「那留下的對象怎麼辦?」
「他們的命運多半懸了,由於沒有別的對象引用他們了,須要把他們清理掉,騰出空間來」
我似懂非懂,一邊走一邊擔憂着,很快咱們就到了傳說中的
Survivor To區,管理員安排咱們都坐下,「這裏好小啊」
「那可不,比起你原來的
Eden區,這裏只有八分之一大小」,我一回頭,剛纔路上碰到的小B竟然就在我和小A的旁邊,巧了不是。
「唉,小B哥,我們這麼折騰一圈是在作什麼啊?」
「這叫作垃圾回收GC,大家開始待那地方叫
Eden區,對象出生的地方都在那裏。我們所在的地方是一個叫
Java Virtual Machine的世界,程序員只管建立對象,無論釋放,這對象愈來愈多,Eden區放不下了,天然就要騰出空間來了。」
我和小A都點了點頭,內心慶幸躲過一劫,擡頭望去,不知何時,那些定住的線程們又開始忙活起來了。
「還沒恭喜大家呢,長大一歲了」,小B拍了拍我倆的肩膀,我倆面面相覷,滿臉問號。
「這是從何提及呢?」,小A先開口了。
「大家頭上的MarkWord第3-6位記錄的就是大家的年齡,通過一次GC就長大一歲了!」我倆互相看了看,又看了看小B的GC年齡位置,竟然已經15歲了。
![](http://static.javashuo.com/static/loading.gif)
「小B哥,難怪你見多識廣,都一把年紀了呀。咦,這表示GC年紀的只有4位,最大隻能表示到15,等會兒要是再來一次GC,這不要裝不下了嗎?」,看着小B的腦殼,我陷入了思考。
「再來一次GC我要是還能倖存,我就要進入老年代區域了,就不能陪大家玩兒了」,小B看着咱們眨了眨眼睛。
「老年代,那是什麼地方,咱們不能去嗎?」
「都說了是老年代了,是我這種老年對象去的地方,大家新來的還要在
Survivor To區和
Survivor From區兜兜轉轉好些回合呢,等大家到我這把年紀就能過去了」
![](http://static.javashuo.com/static/loading.gif)
「啊,爲何這麼麻煩,設置這麼多區都是幹嗎的啊?」小A急着問。
小B把手搭在小A的肩說到:「這裏的管理員用的是標記-複製算法來清理空間,因此須要在
Eden區以外再設一個地方接收復制活下來的對象。」
「那加一個
Survivor區就夠了啊,幹嗎弄兩個
Survivor區?」我也拋了一個問題。
小B把另外一隻手搭在了個人肩上,「這是爲了讓存活的對象可以在這邊反覆流轉,不要着急去老年代區域」
「那爲何
Survivor比
Eden小那麼多?」,我繼續問到
「根據他們統計發現,98%的對象都活不過一輪GC,留下來的都是少數。並且兩個
Survivor區有一個要空着,若是太大就太浪費了。」
聽着小B的話咱們倆都陷入了沉思。
沒過一下子,廣播又響了起來:「各線程注意,請進入安全點等待,各分區注意,啓動一次Minor GC」,剛剛平靜的心又一次懸了起來。
管理員又開始點名,這一次,我和小B都被點到了,而沒有聽到小A的名字。
咱們跟小A告別了,離開了
Survivor To區,走到分叉路口,小B也跟我作別:「再見了朋友,若是有機會,老年代等你來再聚」
接下來就只剩我一個對象了,跟隨陌生的對象隊伍來到了
Survivor From區,這裏跟剛纔的To區規模至關,只是隊伍比起以前那次又小了不少。
來到本身的位置坐好,看了看頭上的GC年齡位,我2歲了。
Finalizer對象
沒有了熟悉的朋友,獨自發着呆,等待着線程們來訪問我。
忽然,有人拍了拍個人肩膀,我回頭看去,竟然是小A,他跑的氣喘吁吁的。
「你不是沒有被唸到名字,沒有對象再引用你了嗎,竟然沒有被清理?」,再次看見小A,我有點難以置信。
「剛纔真的好險,我都嚇死了,沒想到事情出現了起色!」
「發生了什麼,快告訴我!」,我火燒眉毛的想知道這一切到底是怎麼回事。
小A喘了幾口氣繼續說到:「就在大家走後,管理員又拿出了另一份名單,個人名字竟然在上面,我一打聽才知道原來檢查到有一個
Finalizer對象還在引用我~」
「奇怪了,不是說沒有對象嗎,怎麼又冒出了一個
Finalizer對象?這是什麼?」
「
後來我見到了那個Finalizer對象,就在開始咱們沒多遠的位置,聽他說是由於我所屬的類有覆蓋finalize方法,因此在我出生的時候,他也一同誕生,而且一直持有個人引用」
「那後來呢?」,我繼續追問。「後來啊,他被管理員放進了一個ReferenceQueue的隊列去了,他們把那地方叫F-Queue監獄。等待一個名字也叫Finalizer的線程大叔去處理,經過Finalizer對象來調用個人finalize方法,以後就把咱們之間的聯繫切斷了」
「他要倒黴了!不過好在仍是救了你一命」
「躲得了初一,躲不過十五,如今連Finalizer對象也沒引用我了,下一次GC我鐵定要完蛋的」,小A說完又低下了頭。
「別想那麼多,作對象最重要的就是開心了,說不定下一次我陪你一塊兒完蛋呢」
我倆剛剛說完,熟悉的廣播又想起了:「各線程注意,請進入安全點等待,各分區注意,啓動一次Minor GC」
很快,管理員就念到了個人名字,看來我還能撐下去。快到結束的時候,管理員竟然神奇般的唸到了小A的名字。
「小A,你聽到了嗎,竟然還有對象在引用你!」我高興的對小A說到,小A也使勁點點頭。
「我知道了,必定是Finalizer線程大哥在執行個人finalize方法的時候,又把我和誰創建了聯繫,對,必定是這樣!」
咱們再一次從To區來到了From區,這一次又少了不少舊面孔,不過從Eden區來了很多新面孔。
日後的一段時間裏,咱們在這兜兜轉轉了好多輪,終於看到頭上的年齡標記慢慢變成了15歲。
Full GC
沒過多久,廣播再次響起,我和小A幸運的再次被點到名字,隨後,管理員檢查了我和小A,發現我倆超齡了,直接給咱們趕到了一條新的路上,我知道前面就是傳說中的老年代了。
來到這個陌生的地方,放眼望去,這裏可比我待過的Eden區、From區、To區加起來還要大,裏面有好多的對象,密密麻麻的,不過看上去一個個都不是省油的燈,畢竟能來到這裏的對象,比起Eden區的那些萌新都是些老油條了。
![](http://static.javashuo.com/static/loading.gif)
我倆找到本身的位置坐下開始閒聊,這時,從不遠處走過來一個身影,走近一看正是以前的小B。
「唉,這不是小A嗎,記得你不是被清理了嗎,怎麼來這兒了?」,對於小A的出現,小B哥有些驚訝。
隨後小A也向小B聊起了以前的那段驚險經歷~
正在閒聊的時候,管理員忽然進來圈了一大片空閒的位置,建立了一個巨大的對象!衆對象都驚呆了!
「小B哥,這哥們什麼來路,空降啊,直接到老年代!」我好奇的問到。
「沒辦法,誰叫人家體格大,Eden區要麼裝不下,要麼嫌給他複製過去複製過來太費勁,因此直接給安排到這裏了,不像咱們要一點點熬過來。」
「各線程注意,請進入安全點等待,各分區注意,啓動一次Full GC「,熟悉的廣播又一次響起,只不過這一次聽到的是Full GC。
「看來內存吃緊了啊!」小B嘆了口氣。
管理員又開始點名了,這一次,幸運再也不眷顧小A。
未完待續~~
彩蛋:
一個線程小姐姐迎面向我走了過來。
「Hi,小朋友你好,我是3002號線程,如今我要來鎖定你,別動哦,讓我檢查下你的MarkWord」「lock位是01,Good!讓我再看看偏向鎖標記位,呀!是個1,糟糕」,小姐姐皺起了眉頭。
欲知後事如何,請關注後續精彩......