java GC 垃圾回收

如何判斷對象是否需要回收:

1.計數算法: 缺點: 無法找到互相引用的對象

2.可達性分析: 從root出發 根據引用向下走,最後沒有到達的對象爲回收對象

root是哪: 最主要是棧中的引用對象,除此外還有 靜態引用對象、常量對象。加個本地方法JNI引用對象。

引用分類:

強(不能回收)

軟(有用但不必要,如果發生內存溢出則回收)

弱(非必要,估計也沒用,食之無味棄之可惜系列) 能生存一次,下次回收。

虛  回收沒商量

垃圾還有機會生存嗎:

  有,畢竟上天有好生之德,如果這個對象能執行finalize()方法,而finalize裏將對象再次引用就能活下來了,但每個對象一生只能執行一次finalize(),所以在成爲垃圾就一定被回收了。

好好說說回收算法。

三種回收方法:

標記-清除: 就是上面標記出來的垃圾直接回收,簡單暴力,缺點:效率不行,這不是關鍵,關鍵是內容被分成一塊塊了,以後有大需求還了得?所以要改進啊!下面是2個改進算法

複製 : 首先把內存分爲2塊 一塊用着,一塊備着,一塊滿啦,就要回收啦! 怎麼收呢,第一步和上面一樣,找出垃圾(不找垃圾怎麼玩),爲了能在回收後得到連續的內容,所以需要將第一塊上的非垃圾移到備着那塊上,然後把第一塊全部清理就行啦!但又有問題了,萬一第一塊滿了,但就幾個是垃圾呢? 那不全要複製了(這效率低到爆炸啊)所以最後的算法來了 從這也能看出複製算法比較適合哪種垃圾比較多的內存區域, 比如說堆得 新生代(就是哪種活的不長的對象呆的地方) 這個算法還有個缺點就是浪費內存啊,畢竟還要備着一份,

標記整理   適用於哪種垃圾不多的內存區域(老年代) 第一步 找垃圾 第二步 將垃圾都移到一起(移到非垃圾的後面),比標記-清除多的一步,第三步 就是清理垃圾啦!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章