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