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