JVM中垃圾收集算法总结
??通過前面的介紹我們了解了對象創建和銷毀的過程。那么JVM中垃圾收集器具體對對象回收采用的是什么算法呢?本文主要記錄下JVM中垃圾收集的幾種算法。
文章目錄
- JVM的垃圾回收的算法
- 標記-清除算法(Mark-Sweep)
- 復制算法(Copying)
- 標記-整理算法(Mark-Compact)
- 分代收集算法
- 1.年輕代
- 2.老年代
- 3.永久代
JVM的垃圾回收的算法
標記-清除算法(Mark-Sweep)
??標記清除算法是最基礎的回收算法,該算法分為兩個階段,即標記階段和清除階段。
| 標記階段 | 先根據可達性分析算法找出需要回收的對象進行標記 |
| 清除階段 | 統一回收被標記的對象 |
參考《深入理解java虛擬機》:
從可達性分析算法角度看標記-清除算法
該算法不足有兩點:
復制算法(Copying)
??復制算法是為了解決標記清除算法效率不高的問題而產生的,該算法的思路是。將內存空間一分為二(大小相等)。每次只使用其中一塊來存儲對象,當一塊內存使用的差不多的時候就將這塊中還存活的對象就復制到另一塊內存中,然后清理掉已經使用過的那塊內存。如下
這種算法的好處是每次直接對一半空間進行回收而且也不用考慮內存碎片的問題了,但是直接把空間砍掉一半。代價有點兒大。
標記-整理算法(Mark-Compact)
??標記-整理算法采用標記-清除算法一樣的方式進行對象的標記,但在清除時不同,在回收不存活的對象占用的空間后,會將所有的存活對象往左端空閑空間移動,并更新對應的指針。標記-整理算法是在標記-清除算法的基礎上,又進行了對象的移動,因此成本更高,但是卻解決了內存碎片的問題
分代收集算法
??分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根據對象存活的生命周期將內存劃分為若干個不同的區域。一般情況下將堆區劃分為老年代(Tenured Generation)和新生代(Young Generation),在堆區之外還有一個代就是永久代(Permanet Generation)。老年代的特點是每次垃圾收集時只有少量對象需要被回收,而新生代的特點是每次垃圾回收時都有大量的對象需要被回收,那么就可以根據不同代的特點采取最適合的收集算法。
1.年輕代
??回收算法以Copying為主,新創建的對象都存放在這里。因為大多數對象很快變得不可達,所以大多數對象在年輕代中創建,然后消失。當對象從這塊內存區域消失時,我們說發生了一次“minor GC”
2.老年代
??回收算法主要以Mark-Compact為主,沒有變得不可達,存活下來的年輕代對象被復制到這里。這塊內存區域一般大于年輕代。因為它更大的規模,GC發生的次數比在年輕代的少。對象從老年代消失時,我們說“major GC”(或“full GC”)發生了
在年輕代中經歷了N次垃圾回收后仍然存活的對象,就會被放到年老代中。因此,可以認為年老代中存放的都是一些生命周期較長的對象。
內存比新生代也大很多(大概比例是1:2),當老年代內存滿時觸發Major GC即Full GC,Full GC發生頻率比較低,老年代對象存活時間比較長,存活率標記高。
3.永久代
??用于存放靜態文件,如Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應用可能動態生成或者調用一些class,例如Hibernate 等,在這種時候需要設置一個比較大的永久代空間來存放這些運行過程中新增的類。永久代也稱方法區,
??注意:這塊內存區域絕對不是永久的存放從老年代存活下來的對象的!!!在這塊內存中有可能發生垃圾回收。發生在這里垃圾回收也被稱為major GC
總結
以上是生活随笔為你收集整理的JVM中垃圾收集算法总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 细说会声会影各版本安装的配置要求及注意事
- 下一篇: VBA全局变量