1. 程式人生 > >JAVA 記憶體回收

JAVA 記憶體回收

參考:https://www.cnblogs.com/leesf456/p/5218594.html

1,JMV 中哪些可以作為 GC Root?

    1. 虛擬機器棧(棧幀中的區域性變數區,也叫做區域性變量表)中引用的物件。

    2. 方法區中的類靜態屬性引用的物件。

    3. 方法區中常量引用的物件。

    4. 本地方法棧中JNI(Native方法)引用的物件。

2,物件的引用:

    強引用

    弱引用:在記憶體溢位前(會嘗試回收部分記憶體)

    軟引用:在下一次垃圾蒐集時

    虛引用:垃圾回收時,收到系統通知。

3, java 垃圾回收演算法: 引用計數演算法 和 根可達性演算法。 引用計數演算法是早起的垃圾回收演算法,在物件出現迴圈引用的情況下,不方便回收。 根搜尋演算法,從根節點開始搜尋引用的節點,沒有被引用的節點,則是可回收的節點。

  • 標記清除演算法:mark & sweep : 效率高,對不使用的物件直接清除,會造成記憶體碎片。
  • 標記整理演算法:collection : 在標記後,將存活的物件向左邊移動。解決了記憶體碎片問題,但是成本更高。
  • 複製演算法:將記憶體分成空閒區和物件區,在gc的時候,總是copy存活的物件到空閒區,因此空閒區域和物件區域總是對調。
  • 分代回收策略:年輕代,老年代,持久代。

    在年輕代中經歷了N次垃圾回收後仍然存活的物件,就會被放到年老代中。因此,可以認為年老代中存放的都是一些生命週期較長的物件。

    2.記憶體比新生代也大很多(大概比例是1:2),當老年代記憶體滿時觸發Major GC即Full GC,Full GC發生頻率比較低,老年代物件存活時間比較長,存活率標記高。

    持久代(Permanent Generation)

    用於存放靜態檔案,如Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應用可能動態生成或者呼叫一些class,例如Hibernate 等,在這種時候需要設定一個比較大的持久代空間來存放這些執行過程中新增的類。