一、問題

  筆者最近遇到超級多的關于java中垃圾回收機制的問題,所以特地寫一遍博客來和大家交流一下java中的垃圾回收到底是什么鬼。所謂垃圾回收即使jvm覺得你這個對象沒有存在的必要,將你清理出去,那么問題來了。

  1. 如何確定某個對象是需要被回收?

  2. 典型的垃圾收集算法,是怎么回收對象的?

  3. 典型的垃圾收集器有哪些?

  下面我來一個一個看問題

二、如何確定某個對象是需要被回收的

  這里我們先了解一個的問題:如果確定某個對象是“垃圾”?既然垃圾收集器的任務是回收垃圾對象所占的空間供新的對象使用,那么垃圾收集器如何確定某個對象是“垃圾”?—即通過什么方法判斷一個對象可以被回收了。有些對象是jvm內存不足需要清理內存空間,會將下一輪需要回收的對象進行清理。

  在java中是通過引用來和對象進行關聯(lián)的,也就是說如果要操作對象,必須通過引用來進行。那么很顯然一個簡單的辦法就是通過引用計數(shù)來判斷一個對象是否可以被回收。不失一般性,如果一個對象沒有任何引用與之關聯(lián),則說明該對象基本不太可能在其他地方被使用到,那么這個對象就成為可被回收的對象了。這種方式成為引用計數(shù)法。

  這樣的方法簡單粗暴,而且效率很高。效率高必然會暴露一些問題,如果某些對象唄循環(huán)引用,即使你把對象賦值為null,這種算法照樣不能回收??聪孪旅娴拇a

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓

public class GcTest {    public Object object = null;    
    public static void main(String[] args) {
        
        GcTest gcTest1 = new GcTest();
        GcTest gcTest2 = new GcTest();
        
        gcTest1.object = gcTest1;
        gcTest2.object = gcTest2;
        
        gcTest1 = null;
        gcTest2 = null;
    }
}

延伸閱讀

學習是年輕人改變自己的最好方式-Java培訓,做最負責任的教育,學習改變命運,軟件學習,再就業(yè),大學生如何就業(yè),幫大學生找到好工作,lphotoshop培訓,電腦培訓,電腦維修培訓,移動軟件開發(fā)培訓,網(wǎng)站設計培訓,網(wǎng)站建設培訓學習是年輕人改變自己的最好方式