終結處理和垃圾回收:
1.finalization機制
使用: 當你的對象(并非通過new建立)獲得了一塊記憶體,由于垃圾回收器隻知道釋放那些由new配置設定的記憶體,是以Java提供finalization機制釋放這些“特殊”記憶體;
例如一個對象正在處理的是非Java 資源,如檔案句柄或window 字元字型,這時你要确認在一個對象被撤消以前要保證這些資源被釋放。
為處理這樣的狀況,Java 提供了被稱為收尾(finalization )的機制。
調用: 隻有垃圾回收器準備釋放某對象記憶體時會先調用該對象的finalize()方法;
注意點: 1).對象不一定會被回收;
2).垃圾回收并不等于“析構” ;“析構“中對象一定被銷毀(如果程式沒有缺陷),而Java中,隻有JVM記憶體資源耗盡才會釋放記憶體,銷毀對象
3).垃圾回收隻與記憶體有關 ;使用垃圾回收器的唯一原因是為了回收程式中不再使用的記憶體
;在JVM并未面臨記憶體耗盡的情形,它是不會浪費時間去執行垃圾回收以恢複記憶體的
結論: 1).finalize()方法隻有在垃圾回收器釋放對象前才調用
2).垃圾回收器隻會釋放那些有new配置設定的記憶體,是以Java提供finalization機制
3).Java 的自動垃圾回收器不會失去平衡;然而,作為便利的代價,你不得不放棄對系統資源釋放的控制;
2.垃圾回收器
在其他語言中,在堆上配置設定對象的代價十分高昂,而Java垃圾回收器對于提高對象的建立速度,具有明顯的效果;Java的堆實作像一個傳送帶,每配置設定一個對象就往前移動一格,但這樣
會造成記憶體頁面頻繁排程,影響性能;垃圾回收器一面回收空間,一面使堆中的對象緊湊排列,這樣”堆指針“就會很容易移動到傳送帶的開始處,也盡量地避免頁面錯誤;
通過垃圾回收器對對象的重新排列,實作了一種高速的、有無限空間可供配置設定的堆模型;
垃圾回收技術:自适應技術
1)停止-複制
原理:先暫停程式的運作,然後将所有存活的對象從目前堆複制到另一個堆中,沒有被複制的全部是垃圾
缺點:a)需要兩個堆,得維護多一倍的空間 b)程式進入穩定狀态後,可能隻會産生很少的垃圾,這時将所有記憶體複制,很浪費
2)标志-清掃
原理:暫停,從堆棧和靜态存儲區出發,周遊所有引用,進而找出所有存活的對象;每找到一個”活“對象就進行标志,全部标志完了之後;
清理工作開始,沒有被标志的對象将被釋放,不會發生任何複制動作;剩下的堆空間是不連續的,需要垃圾回收器重新排序;
缺點:速度較慢
自适應技術:如果所有對象多很穩定,垃圾回收器的效率低的話,就切換到”标志-清掃“模式;同樣,Java虛拟機會跟蹤”标志-清掃“的效果,要是堆空間出現很多碎片
就會切換到”停止-複制“方式
提高JVM速度的附加技術,”即時“(Just-In-Time)編譯器的技術