問題一什么叫垃圾回收機制
垃圾回收是一種動態存儲管理技術它自動地釋放不再被程序引用的對象按照特定的垃圾收集算法來實現資源自動回收的功能。當一個對象不再被引用的時候內存回收它占領的空間以便空間被后來的新對象使用以免造成內存泄露。
問題二java的垃圾回收有什么特點
JAVA語言不允許程序員直接控制內存空間的使用。內存空間的分配和回收都是由JRE負責在后台自動進行的尤其是無用內存空間的回收操作(garbagecollection,也稱垃圾回收)只能由運行環境提供的一個超級線程進行監測和控制。
問題三垃圾回收器什么時候會運行
一般是在CPU空閑或空間不足時自動進行垃圾回收而程序員無法精確控制垃圾回收的時機和順序等。
問題四什么樣的對象符合垃圾回收條件
當沒有任何獲得線程能訪問一個對象時該對象就符合垃圾回收條件。
問題五垃圾回收器是怎樣工作的
垃圾回收器如發現一個對象不能被任何活線程訪問時他將認為該對象符合刪除條件就將其加入回收隊列但不是立即銷毀對象何時銷毀並釋放內存是無法預知的。垃圾回收不能強制執行然而Java提供了一些方法如System.gc()方法允許你請求JVM執行垃圾回收而不是要求虛擬機會盡其所能滿足請求但是不能保證JVM從內存中刪除所有不用的對象。
問題六一個java程序能夠耗盡內存嗎
可以。垃圾收集系統嘗試在對象不被使用時把他們從內存中刪除。然而如果保持太多活的對象系統則可能會耗盡內存。垃圾回收器不能保證有足夠的內存只能保證可用內存盡可能的得到高效的管理。
問題七如何顯示的使對象符合垃圾回收條件
1 空引用
當對象沒有對他可到達引用時他就符合垃圾回收的條件。也就是說如果沒有對他的引用刪除對象的引用就可以達到目的因此我們可以把引用變量設置為null來符合垃圾回收的條件。
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"符合回收條件
3 方法內創建的對象
所創建的局部變量僅在該方法的作用期間內存在。一旦該方法返回在這個方法內創建的對象就符合垃圾收集條件。有一種明顯的例外情況就是方法的返回對象。
public static void main(String[] args) { Date d = getDate(); System.out.println("d = " + d); } private static Date getDate() { Date d2 = new Date(); StringBuffer now = new StringBuffer(d2.toString()); System.out.println(now); return d2; }
4 隔離引用
這種情況中被回收的對象仍具有引用這種情況稱作隔離島。若存在這兩個實例他們互相引用並且這兩個對象的所有其他引用都刪除其他任何線程無法訪問這兩個對象中的任意一個。也可以符合垃圾回收條件。
public class Island { Island i; public static void main(String[] args) { Island i2 = new Island(); Island i3 = new Island(); Island i4 = new Island(); i2.i=i3; i3.i=i4; i4.i=i2; i2=null; i3=null; i4=null; } }
問題八垃圾收集前進行清理 ------finalize()方法
java提供了一種機制使你能夠在對象剛要被垃圾回收之前運行一些代碼。這段代碼位於名為finalize()的方法內所有類從Object類繼承這個方法。由於不能保證垃圾回收器會刪除某個對象。因此放在finalize()中的代碼無法保證運行。因此建議不要重寫finalize();