一、問題

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

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

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

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

  下面我來一個(gè)一個(gè)看問題

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

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

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

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

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

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;
    }
}

網(wǎng)友評論