全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

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

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

更新時(shí)間:2019-11-13 來(lái)源:黑馬程序員 瀏覽量:

在Java中,當(dāng)一個(gè)對(duì)象成為垃圾后仍會(huì)占用內(nèi)存空間,時(shí)間一長(zhǎng),就會(huì)導(dǎo)致內(nèi)存空間的不足。針對(duì)這種情況,Java中引入了垃圾回收機(jī)制。程序員不需要過(guò)多關(guān)心垃圾對(duì)象回收的問(wèn)題,Java虛擬機(jī)會(huì)自動(dòng)回收垃圾對(duì)象所占用的內(nèi)存空間。

 

一個(gè)對(duì)象在成為垃圾后會(huì)暫時(shí)地保留在內(nèi)存中,當(dāng)這樣的垃圾堆積到一定程度時(shí),Java虛擬機(jī)就會(huì)啟動(dòng)垃圾回收器將這些垃圾對(duì)象從內(nèi)存中釋放,從而使程序獲得更多可用的內(nèi)存空間。除了等待Java虛擬機(jī)進(jìn)行自動(dòng)垃圾回收,也可以通過(guò)調(diào)用System. gc()方法來(lái)通知Java虛擬機(jī)立即進(jìn)行垃圾回收。當(dāng)一個(gè)對(duì)象在內(nèi)存中被釋放時(shí),它的finalize()方法會(huì)被自動(dòng)調(diào)用,因此可以在類(lèi)中通過(guò)定義finalize()方法來(lái)觀察對(duì)象何時(shí)被釋放。接下來(lái)通過(guò)一個(gè)案例來(lái)演示Java虛擬機(jī)進(jìn)行垃圾回收的過(guò)程。例如la.java。

 

class Person {

    //下面定義的fina1ize方法會(huì)在垃圾回收前被調(diào)用

    public void finalize(){

        System.out.println("對(duì)象將被作為垃圾回收……");

    }

}   

public class la{

    public static void main(String[] args) {

        //下面是創(chuàng)建了兩個(gè) Person對(duì)象

        Person p1 = new Person();

        Person p2 = new Person();

        // 下面將兩個(gè)變量置為null。讓對(duì)象成為垃圾

        p1 = null;

        p2 = null;

        // 調(diào)用方法進(jìn)行垃圾回收

        System.gc();

        for (int i =0; i < 10000000; i++ ) {

            // 為延長(zhǎng)程序的運(yùn)行時(shí)間 

        }

    }

}

 

運(yùn)行結(jié)果如圖

1573627132785_Java垃圾回收機(jī)制.jpg

 

在上面例子中定義了一個(gè) finalize()方法,該方法的返回值必須為void,并且要使用 public來(lái)修飾。在 main()中創(chuàng)建了兩個(gè)對(duì)象p1和p2,然后將兩個(gè)變量置為null,這意味著新創(chuàng)建的兩個(gè)對(duì)象成為垃圾了,緊接著通過(guò)“Systen.gc()”語(yǔ)句通知虛擬機(jī)進(jìn)行垃圾回收。從運(yùn)行結(jié)果可以看出,虛擬機(jī)針對(duì)兩個(gè)垃圾對(duì)象進(jìn)行了回收,并在回收之前分別調(diào)用兩個(gè)對(duì)象的finalize()方法。

 

需要注意的是,Java虛擬機(jī)的垃圾回收操作是在后臺(tái)完成的,程序結(jié)束后,垃圾回收的操作也將終止。因此,在程序的最后使用了一個(gè)for循環(huán),延長(zhǎng)程序運(yùn)行的時(shí)間,從而能夠更好地看到垃圾對(duì)象被回收的過(guò)程。

本文來(lái)自:黑馬程序員


猜你喜歡:

畢向東Java基礎(chǔ)入門(mén)視頻教程下載

自學(xué)java好還是去培訓(xùn)java好?


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