更新時間:2021-05-21 來源:黑馬程序員 瀏覽量:
(1)問題分析:
什么樣的對象會被當做垃圾回收?
如何校驗對象是否被回收?
怎樣通知垃圾回收器回收對象
(2)核心答案講解:
1)問題 : 什么樣的對象會被當做垃圾回收?
當一個對象的引用(地址)沒有變量去記錄的時候, 該對象就會成為垃圾對象, 并在垃圾回收器空閑的時候?qū)ζ溥M行清掃.
2)問題 : 如何校驗對象是否被回收?
可以重寫Object類中的finalize方法
這個方法在垃圾回收器執(zhí)行的時候, 被回收器自動調(diào)用執(zhí)行的.
3)問題 : 怎樣通知垃圾回收器回收對象
可以調(diào)用System類的靜態(tài)方法gc( );
通知垃圾回收器去清理垃圾
(3)問題擴展:
如何判斷哪些對象需要回收呢?
1)引用計數(shù)算法(java中不是使用此方法)
每個對象中添加一個引用計數(shù)器,當有別人引用它的時候,計數(shù)器就會加1,當別人不引用它的時候,計數(shù)器就會減1,當計數(shù)器為0的時候?qū)ο缶涂梢援敵衫K惴ê唵?,但是最大問題就是在循環(huán)引用的時候不能夠正確把對象當成垃圾。
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)系看作一張圖,從一個節(jié)點GC ROOT開始,尋找對應(yīng)的引用節(jié)點,找到這個節(jié)點以后,繼續(xù)尋找這個節(jié)點的引用節(jié)點,當所有的引用節(jié)點尋找完畢之后,剩余的節(jié)點則被認為是沒有被引用到的節(jié)點,即無用的節(jié)點
(4)結(jié)合項目中使用:
1)盡量不要創(chuàng)建很大的對象
原因 : GC回收算法從來不對大對象(>=85000字節(jié))堆進行內(nèi)存壓縮整理,在堆中大的內(nèi)存塊會浪費太多CPU時間
2)不要頻繁的new生命周期很短的對象
這樣頻繁垃圾回收頻繁壓縮有可能會導(dǎo)致很多內(nèi)存碎片
1024首播|39歲程序員逆襲記:不被年齡定義,AI浪潮里再迎春天
2025-10-241024程序員節(jié)丨10年同行,致敬用代碼改變世界的你
2025-10-24【AI設(shè)計】北京143期畢業(yè)僅36天,全員拿下高薪offer!黑馬AI設(shè)計連續(xù)6期100%高薪就業(yè)
2025-09-19【跨境電商運營】深圳跨境電商運營畢業(yè)22個工作日,就業(yè)率91%+,最高薪資達13500元
2025-09-19【AI運維】鄭州運維1期就業(yè)班,畢業(yè)14個工作日,班級93%同學(xué)已拿到Offer, 一線均薪資 1W+
2025-09-19【AI鴻蒙開發(fā)】上海校區(qū)AI鴻蒙開發(fā)4期5期,距離畢業(yè)21天,就業(yè)率91%,平均薪資14046元
2025-09-19