JAVA 內存回收

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

1,JMV 中哪些能夠做爲 GC Root?java

    1. 虛擬機棧(棧幀中的局部變量區,也叫作局部變量表)中引用的對象。算法

    2. 方法區中的類靜態屬性引用的對象。htm

    3. 方法區中常量引用的對象。對象

    4. 本地方法棧中JNI(Native方法)引用的對象。blog

2,對象的引用:索引

    強引用生命週期

    弱引用:在內存溢出前(會嘗試回收部份內存)內存

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

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

3, java 垃圾回收算法: 引用計數算法 和 根可達性算法。 引用計數算法是早起的垃圾回收算法,在對象出現循環引用的狀況下,不方便回收。 根搜索算法,從根節點開始搜索引用的節點,沒有被引用的節點,則是可回收的節點。

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

    在年輕代中經歷了N次垃圾回收後仍然存活的對象,就會被放到年老代中。所以,能夠認爲年老代中存放的都是一些生命週期較長的對象。

    2.內存比新生代也大不少(大概比例是1:2),當老年代內存滿時觸發Major GC即Full GC,Full GC發生頻率比較低,老年代對象存活時間比較長,存活率標記高。

    持久代(Permanent Generation)

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

相關文章
相關標籤/搜索