首頁(yè)技術(shù)文章正文

Java中的垃圾回收機(jī)制是什么?哪些對(duì)象會(huì)被回收?

更新時(shí)間:2021-05-21 來源:黑馬程序員 瀏覽量:

1577370495235_學(xué)IT就到黑馬程序員.gif

(1)問題分析:

什么樣的對(duì)象會(huì)被當(dāng)做垃圾回收?

如何校驗(yàn)對(duì)象是否被回收?

怎樣通知垃圾回收器回收對(duì)象

(2)核心答案講解:

1)問題 : 什么樣的對(duì)象會(huì)被當(dāng)做垃圾回收?

當(dāng)一個(gè)對(duì)象的引用(地址)沒有變量去記錄的時(shí)候, 該對(duì)象就會(huì)成為垃圾對(duì)象, 并在垃圾回收器空閑的時(shí)候?qū)ζ溥M(jìn)行清掃.

2)問題 : 如何校驗(yàn)對(duì)象是否被回收?

可以重寫Object類中的finalize方法

這個(gè)方法在垃圾回收器執(zhí)行的時(shí)候, 被回收器自動(dòng)調(diào)用執(zhí)行的.

3)問題 : 怎樣通知垃圾回收器回收對(duì)象

可以調(diào)用System類的靜態(tài)方法gc( );

通知垃圾回收器去清理垃圾

(3)問題擴(kuò)展:

如何判斷哪些對(duì)象需要回收呢?

1)引用計(jì)數(shù)算法(java中不是使用此方法)

每個(gè)對(duì)象中添加一個(gè)引用計(jì)數(shù)器,當(dāng)有別人引用它的時(shí)候,計(jì)數(shù)器就會(huì)加1,當(dāng)別人不引用它的時(shí)候,計(jì)數(shù)器就會(huì)減1,當(dāng)計(jì)數(shù)器為0的時(shí)候?qū)ο缶涂梢援?dāng)成垃圾。算法簡(jiǎn)單,但是最大問題就是在循環(huán)引用的時(shí)候不能夠正確把對(duì)象當(dāng)成垃圾。

   public class Demo1_Gc {
       public static void main(String[] args) {
         Demo object1 = new Demo();
         Demo object2 = new Demo();

         object1.object = object2;
         object2.object = object1;

         object1 = null;
         object2 = null;
       }
     }


2)根搜索方法

這是JVM一般使用的算法, 根搜索算法是從離散數(shù)學(xué)中的圖論引入的,程序把所有的引用關(guān)系看作一張圖,從一個(gè)節(jié)點(diǎn)GC ROOT開始,尋找對(duì)應(yīng)的引用節(jié)點(diǎn),找到這個(gè)節(jié)點(diǎn)以后,繼續(xù)尋找這個(gè)節(jié)點(diǎn)的引用節(jié)點(diǎn),當(dāng)所有的引用節(jié)點(diǎn)尋找完畢之后,剩余的節(jié)點(diǎn)則被認(rèn)為是沒有被引用到的節(jié)點(diǎn),即無用的節(jié)點(diǎn)

1621567453791_java垃圾回收機(jī)制.png


(4)結(jié)合項(xiàng)目中使用:

1)盡量不要?jiǎng)?chuàng)建很大的對(duì)象

原因 : GC回收算法從來不對(duì)大對(duì)象(>=85000字節(jié))堆進(jìn)行內(nèi)存壓縮整理,在堆中大的內(nèi)存塊會(huì)浪費(fèi)太多CPU時(shí)間

2)不要頻繁的new生命周期很短的對(duì)象

這樣頻繁垃圾回收頻繁壓縮有可能會(huì)導(dǎo)致很多內(nèi)存碎片






猜你喜歡:

Java進(jìn)階之JVM垃圾回收機(jī)制視頻教程

Java垃圾回收機(jī)制[黑馬程序員]

JavaScript數(shù)據(jù)類型:javascript數(shù)據(jù)類型有哪些?

黑馬程序員Java培訓(xùn)

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!