java垃圾回收
簡單看了一下異常處理的課件,感覺內(nèi)容還是可以的,不過少了自定義異常的知識(shí),所以決定把自定義異常內(nèi)容加入進(jìn)去;當(dāng)看到finally關(guān)鍵字的時(shí)候,想起年輕的時(shí)候找工作,經(jīng)常被問到finally、final、與finalize之間的區(qū)別。
finally和final都給介紹了,所以這里簡單說一下finalize。
說道finalize這個(gè)關(guān)鍵字就要說道java的垃圾回收機(jī)制。
在C++處理某實(shí)體時(shí),當(dāng)應(yīng)用不需要某實(shí)體時(shí),就需要調(diào)用delete關(guān)鍵字來告訴系統(tǒng),我不需要這塊空間了,對(duì)于C++程序員來說,需要手動(dòng)調(diào)用,所以是一個(gè)很麻煩很難做的事情,經(jīng)常會(huì)看到一些技術(shù)網(wǎng)站昏天暗地地討論C++內(nèi)存泄漏的話題,有些時(shí)候討論的激烈了,怕是只要見面就會(huì)動(dòng)手了。
在Java中程序員完全不用考慮實(shí)體銷毀,也就是只需要考慮實(shí)體聲明,具體如何銷毀實(shí)體是JVM要做的工作。
JVM的垃圾回收機(jī)制是實(shí)時(shí)監(jiān)控堆內(nèi)存,當(dāng)發(fā)現(xiàn)某些實(shí)體沒有引用時(shí)就會(huì)把這些實(shí)體放入垃圾回收列表中,但這些放入回收列表中的實(shí)體并不是馬上被銷毀,具體何時(shí)被銷毀,那就是JVM的垃圾回收算法做的處理了。
但是很多人還是不放心垃圾回收,所以想要自己控制Java的垃圾回收,在這里我要告訴你這是不可能的;但是你可以做一些處理,告訴JVM需要做垃圾回收了,讓JVM提前做垃圾回收處理,或者可以說讓JVM清理垃圾更容易發(fā)生。有兩種方法可以實(shí)現(xiàn)以上需求,第一種是把堆內(nèi)存中的引用變量移除,相當(dāng)于告訴JVM我已經(jīng)不用這個(gè)實(shí)體了;第二種是調(diào)用System.gc();調(diào)用這個(gè)方法后同樣可以讓JVM更容易發(fā)生垃圾回收。
那這些和finalize有什么關(guān)系呢,在垃圾回收后,會(huì)自動(dòng)調(diào)用finalize()方法,注意,這個(gè)方法是Object中的方法,所以任何實(shí)體類都可以調(diào)用這個(gè)方法,finalize()方法被稱作是垃圾回收的善后方法。看如下例子。
public
class T2 {
private String
name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name =
name;
}
public T2(String name)
{
this.name =
name;
}
public
static void main(String[] args){
for(int i = 0 ; i< 100; i++){
new T2("T"+i);
}
System.gc();//讓JVM更容易發(fā)生垃圾回收
}
//重寫垃圾回收善后的方法
public void
finalize(){
System.out.println(this.getName());
}
}
運(yùn)行時(shí)會(huì)看到效果,如果去掉System.gc();這句話,幾乎看不到任何效果
通過垃圾回收是不是對(duì)finalize有了進(jìn)一步的了解?
finally和final都給介紹了,所以這里簡單說一下finalize。
說道finalize這個(gè)關(guān)鍵字就要說道java的垃圾回收機(jī)制。
在C++處理某實(shí)體時(shí),當(dāng)應(yīng)用不需要某實(shí)體時(shí),就需要調(diào)用delete關(guān)鍵字來告訴系統(tǒng),我不需要這塊空間了,對(duì)于C++程序員來說,需要手動(dòng)調(diào)用,所以是一個(gè)很麻煩很難做的事情,經(jīng)常會(huì)看到一些技術(shù)網(wǎng)站昏天暗地地討論C++內(nèi)存泄漏的話題,有些時(shí)候討論的激烈了,怕是只要見面就會(huì)動(dòng)手了。
在Java中程序員完全不用考慮實(shí)體銷毀,也就是只需要考慮實(shí)體聲明,具體如何銷毀實(shí)體是JVM要做的工作。
JVM的垃圾回收機(jī)制是實(shí)時(shí)監(jiān)控堆內(nèi)存,當(dāng)發(fā)現(xiàn)某些實(shí)體沒有引用時(shí)就會(huì)把這些實(shí)體放入垃圾回收列表中,但這些放入回收列表中的實(shí)體并不是馬上被銷毀,具體何時(shí)被銷毀,那就是JVM的垃圾回收算法做的處理了。
但是很多人還是不放心垃圾回收,所以想要自己控制Java的垃圾回收,在這里我要告訴你這是不可能的;但是你可以做一些處理,告訴JVM需要做垃圾回收了,讓JVM提前做垃圾回收處理,或者可以說讓JVM清理垃圾更容易發(fā)生。有兩種方法可以實(shí)現(xiàn)以上需求,第一種是把堆內(nèi)存中的引用變量移除,相當(dāng)于告訴JVM我已經(jīng)不用這個(gè)實(shí)體了;第二種是調(diào)用System.gc();調(diào)用這個(gè)方法后同樣可以讓JVM更容易發(fā)生垃圾回收。
那這些和finalize有什么關(guān)系呢,在垃圾回收后,會(huì)自動(dòng)調(diào)用finalize()方法,注意,這個(gè)方法是Object中的方法,所以任何實(shí)體類都可以調(diào)用這個(gè)方法,finalize()方法被稱作是垃圾回收的善后方法。看如下例子。
public
class T2 {
name;
{
}
{
name;
{
name;
static void main(String[] args){
for(int i = 0 ; i< 100; i++){
}
System.gc();//讓JVM更容易發(fā)生垃圾回收
//重寫垃圾回收善后的方法
finalize(){
System.out.println(this.getName());
}
}
運(yùn)行時(shí)會(huì)看到效果,如果去掉System.gc();這句話,幾乎看不到任何效果
通過垃圾回收是不是對(duì)finalize有了進(jìn)一步的了解?
posted on 2012-04-22 15:15 hantai 閱讀(126) 評(píng)論(0) 編輯 收藏