1. 程式人生 > >Java垃圾回收與分配策略

Java垃圾回收與分配策略

1.如何判斷物件已死?

a、引用計數法:給物件增加一個引用計數器,每當有一個地方引用他,計數器就加1,當引用失效時,計數器就減1;任何時刻計數器為0的物件就是不能再被使用的,即物件已死; 優點:實現簡單,判定效率高,大部分情況下都是一個不錯的演算法; 缺點:無法解決迴圈引用問題 b、可達性分析演算法:通過一系列稱為“GC Roots"的物件作為起點,從這些節點開始向下搜尋,搜尋過的路徑稱之為“引用鏈”,當一個物件到GC Roots沒有任何引用鏈相連時(從GC Roots到這個物件不可達),證明此物件是不可用的;

一個物件徹底死亡至少要經歷兩次標記過程:1.若物件到任意一個GC Roots物件不可達,將被第一次標記,並且進行一次篩選;篩選依據為此物件是否要執行finalize(),當此物件沒有覆寫finalize()或finalize()被呼叫過,此時物件真正死亡;2.如果物件覆寫finalize()且未被JVM呼叫,此時物件會被放置在F-Queue佇列中稍後由JVM回撥finalize(),如果物件在finalize()中和GC Roots相連,則成功拯救自己,否則真正死亡; 任何物件的finalize()方法都只會被系統自動呼叫一次;

在Java語言中,可作為GC Roots的物件包含下面幾種: 1.虛擬機器棧(棧幀中的本地變量表)中引用的物件 2.方法區中類靜態屬性引用的物件 3.方法區中常量引用的物件 4.本地方法棧中JNI(Native)引用的物件

java將引用分為四類: 強、軟、弱、虛; 1.垃圾回收不會回收強引用物件 2.軟引用:在系統將要發生記憶體溢位之前,會把這些物件列入回收範圍內進行第二次回收 3.弱引用:無論當前記憶體是否夠用,都會回收掉只被弱引用關聯的物件 4.虛引用:為一個物件設定虛引用的目的就是能在這個物件被收集器回收時收到一個系統通知

判斷一個類為無用類的要求: 1.該類的所有例項,已經被回收,即Java堆中不存在該類的例項 2.載入類的類載入器已經被回收 3.該類的Class物件沒有在其他任何地方被引用,無法通過反射訪問該類所有的屬性與方法;

新生代回收(複製演算法)、老年代回收(標記演算法)... ...

記憶體分配回收策略: 1.物件優先在Eden區分配 2.大物件直接進入老年代 3.長期存活的物件將進入老年代 4.動態物件年齡判定:如果Survivor空間中相同年齡的所有物件大小的總和 > Survivor空間的一半,年齡大於等於該年齡的就可以直接進入老年代;