1. 程式人生 > >深入Java虛擬機器閱讀感(二)-Java垃圾回收器與記憶體分配策略

深入Java虛擬機器閱讀感(二)-Java垃圾回收器與記憶體分配策略

垃圾回收器主要演算法:

      1、引用計數法。給物件新增一個計數器,當物件被使用時則加1,當引用失效時則減1,當計數為0時則認為該物件可以被回收。由於該算演算法無法解決物件相互引用而計數不會減為0,導致該物件無法回收,所以該演算法不是Java虛擬垃圾回收器的演算法。

      2、可達性分析演算法。該演算法是虛擬機器的

           

當物件引用不能到達圖中ROOT實際在虛擬機器垃圾回收器中是GC Roots物件時則判斷該物件可以被回收。

Java對引用概念有強變弱:

          強引用如:Objec obj = new Object()這樣引用的物件如果obj不設定為obj=null則永遠都不會被回收;

         軟引用:該引用是物件還可達,但是不是程式必須使用的物件。如果發生記憶體溢位之前則進行回收。如果這次垃圾回收之後記憶體還是不夠則丟擲記憶體溢位的異常資訊。

          弱引用:弱引用描述的是非必須的物件。在當垃圾回收器工作時該物件則被回收。

           虛引用:虛引用也是引用中最弱的一個。虛引用也不能獲取物件例項。虛引用只有在垃圾回收時通知系統

Java 中PhantomReference類設定虛引用。

標記物件生存還是死亡。在分析不可達演算法當中也不是隻要不可達立即回收,需要將不可達物件進行最少兩次標記後才會真正的

回收掉 。在物件真正銷燬時會去檢查finalize方法是否已被執行,或物件沒有覆蓋掉finalize,則虛擬機器認為沒有必要執行finalize。

如果虛擬機器認為有必要執行finalize方法則將該物件放入F-Queue佇列中,由優先順序較低dJVM Finalize執行緒去執行。當執行完finalize也不一定該物件一定會被回收。

回收方法區:

          在HotSpot虛擬機器當中稱為永久代。在Java虛擬機器規範當中,沒有要求對方法區進行垃圾回收。

在使用反射,動態代理時需要注意方法區的記憶體溢位。

          垃圾回收演算法:

                       1.標記-清楚演算法(Mark-Sweep):該演算法將經歷標記與清楚兩個階段,該演算法的效率較低。標記清除後將會有大量不連續的記憶體空間。在需要申請大量連續記憶體時則需要再次進行標記回收。這樣將效率較低。

                         2.複製演算法。複製演算法則是在記憶體中心開闢一塊空間將所有沒有被回收的物件複製值該區域,再將以前的區域清理掉,形成連續可用的空間。該演算法將堆記憶體降至一半。

未完待續........