天天看點

java垃圾回收

(問題一:什麼叫垃圾回收機制?) 垃圾回收是一種動态存儲管理技術,它自動地釋放不再被程式引用的對象,按照特定的垃圾收集算法來實作資源自動回收的功能。當一個對象不再被引用的時候,記憶體回收它占領的空間,以便空間被後來的新對象使用,以免造成記憶體洩露。

(問題二:java的垃圾回收有什麼特點?) JAVA語言不允許程式員直接控制記憶體空間的使用。記憶體空間的配置設定和回收都是由JRE負責在背景自動進行的,尤其是無用記憶體空間的回收操作 (garbagecollection,也稱垃圾回收),隻能由運作環境提供的一個超級線程進行監測和控制。

(問題三:垃圾回收器什麼時候會運作?) 一般是在CPU空閑或空間不足時自動進行垃圾回收,而程式員無法精确控制垃圾回收的時機和順序等。

(問題四:什麼樣的對象符合垃圾回收條件?) 當沒有任何獲得線程能通路一個對象時,該對象就符合垃圾回收條件。

(問題五:垃圾回收器是怎樣工作的?) 垃圾回收器如發現一個對象不能被任何活線程通路時,他将認為該對象符合删除條件,就将其加入回收隊列,但不是立即銷毀對象,何時銷毀并釋放記憶體是無法預知的。垃圾回收不能強制執行,然而Java提供了一些方法(如:System.gc()方法),允許你請求JVM執行垃圾回收,而不是要求,虛拟機會盡其所能滿足請求,但是不能保證JVM從記憶體中删除所有不用的對象。

(問題六:一個java程式能夠耗盡記憶體嗎?) 可以。垃圾收集系統嘗試在對象不被使用時把他們從記憶體中删除。然而,如果保持太多活的對象,系統則可能會耗盡記憶體。垃圾回收器不能保證有足夠的記憶體,隻能保證可用記憶體盡可能的得到高效的管理。

(問題七:如何顯示的使對象符合垃圾回收條件?) 

(1) 空引用 :當對象沒有對他可到達引用時,他就符合垃圾回收的條件。也就是說如果沒有對他的引用,删除對象的引用就可以達到目的,是以我們可以把引用變量設定為 null,來符合垃圾回收的條件。

Java代碼 

StringBuffer sb = new StringBuffer("hello");   

System.out.println(sb);   

sb=null;  

(2) 重新為引用變量指派:可以通過設定引用變量引用另一個對象來解除該引用變量與一個對象間的引用關系。 

StringBuffer sb1 = new StringBuffer("hello");

StringBuffer sb2 = new StringBuffer("goodbye");

System.out.println(sb1);

sb1=sb2;//此時"hello"符合回收條件

 (問題八:垃圾收集前進行清理 ------finalize()方法) java提供了一種機制,使你能夠在對象剛要被垃圾回收之前運作一些代碼。這段代碼位于名為finalize()的方法内,所有類從Object類繼承這個方法。由于不能保證垃圾回收器會删除某個對象。是以放在finalize()中的代碼無法保證運作。是以建議不要重寫finalize();

=============================================================================

<a href="http://blog.csdn.net/zsuguangh/article/details/6429592" target="_blank">文章1可以看</a>

<a href="http://zhidao.baidu.com/link?url=mQmh37xv1NT-u8zwC4qWEj4MboWFpU4NR_LgPJmsgu0eyXZANlpuTyMrVWVLSZQUSnhRn7kKa_aHBt4gXNOniq" target="_blank">文章2可以看</a>

<a href="http://www.cnblogs.com/laoyangHJ/articles/java_gc.html" target="_blank">文章3複雜</a>

     本文轉自韓立偉 51CTO部落格,原文連結:http://blog.51cto.com/hanchaohan/1425424,如需轉載請自行聯系原作者