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

java培訓(xùn):gc()方法

更新時(shí)間:2022-08-15 來(lái)源:黑馬程序員 瀏覽量:

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

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

  下面通過(guò)一個(gè)案例演示Java虛擬機(jī)進(jìn)行垃圾回收的過(guò)程,如文件5-13所示。

  文件5-13 Example13.java

class Person {
    // 下面定義的finalize方法會(huì)在垃圾收回前被調(diào)用
    public void finalize () {
        System.out.println ("對(duì)象將被作為垃圾回收...");
    }
}
public class Example13{
    public static void main (String[] args) {
        // 下面創(chuàng)建兩個(gè)Person對(duì)象
        Person p1 = new Person ();
        Person p2 = new Person ();
        // 下面將變量置為null,讓對(duì)象成為垃圾
        p1 = null;
        p2 = null;
        // 調(diào)用方法進(jìn)行垃圾回收
        System.gc ();
      for (int i = 0; i < 1000000; i++) {
              // 為了延長(zhǎng)程序運(yùn)行時(shí)間
      }
    }
}

  文件5-13的運(yùn)行結(jié)果如圖5-13所示。

1660528412629_文件5-13的運(yùn)行結(jié)果.jpg

  圖5-13 文件5-13的運(yùn)行結(jié)果

  在文件5-13中,第3~5行代碼定義了一個(gè)finalize()方法,該方法的返回值必須為void;第10~11行代碼創(chuàng)建了兩個(gè)對(duì)象p1和p2,然后將兩個(gè)對(duì)象設(shè)置為null,這意味著新創(chuàng)建的兩個(gè)對(duì)象成為垃圾;第16行代碼通過(guò)“System.gc()”語(yǔ)句通知虛擬機(jī)進(jìn)行垃圾回收。需要注意的是,Java虛擬機(jī)的垃圾回收操作是在后臺(tái)完成的,程序結(jié)束后,垃圾回收的操作也將終止。因此,文件5-13的第17~19行代碼使用for循環(huán)來(lái)延長(zhǎng)程序運(yùn)行的時(shí)間,從而能夠更好地看到垃圾對(duì)象被回收的過(guò)程。

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