天天看點

Java終結處理和垃圾回收機制

終結處理和垃圾回收:

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)編譯器的技術