更新時間:2019-11-13 來源:黑馬程序員 瀏覽量:
在Java中,當一個對象成為垃圾后仍會占用內(nèi)存空間,時間一長,就會導致內(nèi)存空間的不足。針對這種情況,Java中引入了垃圾回收機制。程序員不需要過多關(guān)心垃圾對象回收的問題,Java虛擬機會自動回收垃圾對象所占用的內(nèi)存空間。
一個對象在成為垃圾后會暫時地保留在內(nèi)存中,當這樣的垃圾堆積到一定程度時,Java虛擬機就會啟動垃圾回收器將這些垃圾對象從內(nèi)存中釋放,從而使程序獲得更多可用的內(nèi)存空間。除了等待Java虛擬機進行自動垃圾回收,也可以通過調(diào)用System. gc()方法來通知Java虛擬機立即進行垃圾回收。當一個對象在內(nèi)存中被釋放時,它的finalize()方法會被自動調(diào)用,因此可以在類中通過定義finalize()方法來觀察對象何時被釋放。接下來通過一個案例來演示Java虛擬機進行垃圾回收的過程。例如la.java。
class Person {
//下面定義的fina1ize方法會在垃圾回收前被調(diào)用
public void finalize(){
System.out.println("對象將被作為垃圾回收……");
}
}
public class la{
public static void main(String[] args) {
//下面是創(chuàng)建了兩個 Person對象
Person p1 = new Person();
Person p2 = new Person();
// 下面將兩個變量置為null。讓對象成為垃圾
p1 = null;
p2 = null;
// 調(diào)用方法進行垃圾回收
System.gc();
for (int i =0; i < 10000000; i++ ) {
// 為延長程序的運行時間
}
}
}
運行結(jié)果如圖
在上面例子中定義了一個 finalize()方法,該方法的返回值必須為void,并且要使用 public來修飾。在 main()中創(chuàng)建了兩個對象p1和p2,然后將兩個變量置為null,這意味著新創(chuàng)建的兩個對象成為垃圾了,緊接著通過“Systen.gc()”語句通知虛擬機進行垃圾回收。從運行結(jié)果可以看出,虛擬機針對兩個垃圾對象進行了回收,并在回收之前分別調(diào)用兩個對象的finalize()方法。
需要注意的是,Java虛擬機的垃圾回收操作是在后臺完成的,程序結(jié)束后,垃圾回收的操作也將終止。因此,在程序的最后使用了一個for循環(huán),延長程序運行的時間,從而能夠更好地看到垃圾對象被回收的過程。
本文來自:黑馬程序員
猜你喜歡: