深入JVM垃圾收集(GC流程)

JVM垃圾收集機(jī)制


整個(gè)JVM中的GC的處理機(jī)制:對(duì)不需要的對(duì)象進(jìn)行標(biāo)記,而后進(jìn)行清除.

JDK 1.8之后將最初的永久代內(nèi)存空間取消了

取消永久代目的:是為了將HotSpot與JRockit兩個(gè)虛擬機(jī)標(biāo)準(zhǔn)聯(lián)合為一個(gè)。

在整個(gè)的JVM堆內(nèi)存之中實(shí)際上將內(nèi)存分為了三塊:

  • 年輕代:新對(duì)象和沒達(dá)到一定年齡的對(duì)象都在年輕代;
  • 老年代:被長(zhǎng)時(shí)間使用的對(duì)象,老年代的內(nèi)存空間應(yīng)該要比年輕代更大;
  • 元空間:像一些方法中的操作臨時(shí)對(duì)象等,直接使用物理內(nèi)存;


  • 最初的永久代是需要在JVM堆內(nèi)存里面進(jìn)行劃分

GC流程

所有的數(shù)據(jù)都會(huì)保存在JVM的堆內(nèi)存之中,但是在實(shí)際的開發(fā)之中經(jīng)常會(huì)創(chuàng)建許多的臨時(shí)對(duì)象,也會(huì)有一些常駐對(duì)象存在,所以為了保證GC的性能問題,對(duì)于GC
的處理流程如下圖所示

對(duì)于整個(gè)的GC流程里面,那么最需要處理的就是年輕代與老年代的內(nèi)存清理操作,而元空間(永久代)都不在GC范圍內(nèi);

  1. 當(dāng)現(xiàn)在有一個(gè)新的對(duì)象產(chǎn)生,那么對(duì)象一定需要內(nèi)存空間,于是現(xiàn)在就需要為該對(duì)象進(jìn)行內(nèi)存空間的申請(qǐng);

  2. 首先會(huì)判斷伊甸園區(qū)是否有內(nèi)存空間,如果此時(shí)有內(nèi)存空間,則直接將新對(duì)象保存在伊甸園區(qū);

  3. 但是如果此時(shí)伊甸園區(qū)的內(nèi)存空間不足,那么會(huì)自動(dòng)執(zhí)行一個(gè)MinorGC操作,將伊甸園區(qū)的無用內(nèi)存空間進(jìn)行清理,清理之后會(huì)繼續(xù)判斷伊甸園區(qū)的內(nèi)存空間是否充足?如果內(nèi)存空間充足,則將新的對(duì)象直接在伊甸園區(qū)進(jìn)行空間分配;

  4. 如果執(zhí)行了Minor GC之后發(fā)現(xiàn)伊甸園區(qū)的內(nèi)存依然不足,那么這個(gè)時(shí)候會(huì)進(jìn)行存活區(qū)判斷,如果存活區(qū)有剩余空間,則將伊甸園區(qū)的部分活躍對(duì)象保存在存活區(qū),那么隨后繼續(xù)判斷伊甸園區(qū)的內(nèi)存空間是否充足,如果充足,則在伊甸園區(qū)進(jìn)行新對(duì)象的空間分配;

  5. 如果此時(shí)存活區(qū)也已經(jīng)沒有內(nèi)存空間了,則繼續(xù)判斷老年區(qū),如果此時(shí)老年區(qū)空間充足,則將存活區(qū)中的活躍對(duì)象保存到老年代,而后存活區(qū)就會(huì)存現(xiàn)有空余空間,隨后伊甸園區(qū)將活躍對(duì)象保存在存活區(qū)之中,而后在伊甸園區(qū)里為新對(duì)象開辟空間;

  6. 如果這個(gè)時(shí)候老年代也滿了,那么這個(gè)時(shí)候?qū)a(chǎn)生M ajor GC(FullGC),進(jìn)行老年代的內(nèi)存清理。

  7. 如果老年代執(zhí)行了Full GC之后發(fā)現(xiàn)依然無法進(jìn)行對(duì)象的保存,就會(huì)產(chǎn)生OOM異?!癘utOfMemoryError”

那么請(qǐng)思考“StackOverflowError”和“OutOfMemoryError”的區(qū)別是什么呢?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 作者:一字馬胡 轉(zhuǎn)載標(biāo)志 【2017-11-12】 更新日志 日期更新內(nèi)容備注 2017-11-12新建文章初版 ...
    beneke閱讀 2,334評(píng)論 0 7
  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虛擬機(jī)(JVM)垃圾回收器提供...
    簡(jiǎn)欲明心閱讀 90,389評(píng)論 17 311
  • 原文閱讀 前言 這段時(shí)間懈怠了,罪過! 最近看到有同事也開始用上了微信公眾號(hào)寫博客了,挺好的~給他們點(diǎn)贊,這博客我...
    碼農(nóng)戲碼閱讀 6,163評(píng)論 2 31
  • 一. 垃圾回收的意義 在C++中,對(duì)象所占的內(nèi)存在程序結(jié)束運(yùn)行之前一直被占用,在明確釋放之前不能分配給其它對(duì)...
    Stan_Z閱讀 2,059評(píng)論 0 25
  • JVM架構(gòu) 當(dāng)一個(gè)程序啟動(dòng)之前,它的class會(huì)被類裝載器裝入方法區(qū)(Permanent區(qū)),執(zhí)行引擎讀取方法區(qū)的...
    cocohaifang閱讀 1,852評(píng)論 0 7

友情鏈接更多精彩內(nèi)容