java中Object類的finalize的用法
Object類的finalize的用法:
馬克-to-win:java當(dāng)中有個垃圾回收機(jī)制,具體說,就是當(dāng)一些對象被創(chuàng)建使用之后若不再使用的話{比如(i)對象被置成null.(ii)局部對象(無需置成null)當(dāng)程序運(yùn)行到右大括號.(iii)匿名對象剛用完},就會變成垃圾占用空間,JAVA的自動垃圾回收(gc)線程會在適當(dāng)?shù)臅r候自動運(yùn)行,回收內(nèi)存。馬克-to-win:再具體一點(diǎn),對象被創(chuàng)建之后,垃圾回收(gc)系統(tǒng)就開始跟蹤這個對象的使用情況。垃圾回收系統(tǒng)采用有向圖的方式:開始時對象一定是可達(dá)的,剛把它置為 null時,它也就變成了不可達(dá)的了,這時就是所謂的垃圾。垃圾回收系統(tǒng)就會回收這些內(nèi)存空間。馬克-to-win:回收之前,先調(diào)用該對象的 finalize方法。讓其做一些最后的收尾工作。見下例,當(dāng)p1 = null;時,Java的垃圾回收線程會在適當(dāng)時間點(diǎn)回收p1對象占據(jù)的內(nèi)存空間。馬克-to-win:回收之前,首先調(diào)用p1的finalize()。但是sun公司不保證finalize方法會被及時地自動執(zhí)行。所以我們加了一句,System.gc ();建議系統(tǒng)回收一下垃圾。gc代表garbage collection(垃圾回收),finalize方法就被執(zhí)行了。
馬克- to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號: 73203。
例2.1.4
class PersonMark_to_win {
String name;
public PersonMark_to_win(String n) {
name = n;
}
public void finalize() {
System.out.println(name + " 在進(jìn)行finalize");
}
}
public class Test {
public static void main(String[] args) throws InterruptedException {
PersonMark_to_win p1 = new PersonMark_to_win("張三");
PersonMark_to_win p2 = new PersonMark_to_win("李四");
p1 = null;
// p2 = null;
System.gc();
// Thread.sleep(3000);//如果發(fā)現(xiàn)gc不執(zhí)行,就運(yùn)行一下sleep
}
}
輸出結(jié)果:
張三 在進(jìn)行finalize
例2.1.4_a
class PersonMark_to_win {
String name;
public PersonMark_to_win(String n) {
name = n;
}
public void finalize() {
System.out.println(name + " 在進(jìn)行finalize");
}
void test(){
PersonMark_to_win pp1 = new PersonMark_to_win("張三jubu");
}
}
public class Test {
public static void main(String[] args) throws InterruptedException {
PersonMark_to_win p1 = new PersonMark_to_win("張三");
PersonMark_to_win p2 = new PersonMark_to_win("李四");
p2.test();
System.gc();
p1 = null;
// p2 = null;
System.gc();
Thread.sleep(3000);//如果發(fā)現(xiàn)gc不執(zhí)行,就運(yùn)行一下sleep
}
}
結(jié)果:
張三jubu 在進(jìn)行finalize
張三 在進(jìn)行finalize