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

JVM垃圾收集機制


整個JVM中的GC的處理機制:對不需要的對象進行標記,而后進行清除.

JDK 1.8之后將最初的永久代內存空間取消了

取消永久代目的:是為了將HotSpot與JRockit兩個虛擬機標準聯合為一個。

在整個的JVM堆內存之中實際上將內存分為了三塊:

  • 年輕代:新對象和沒達到一定年齡的對象都在年輕代;
  • 老年代:被長時間使用的對象,老年代的內存空間應該要比年輕代更大;
  • 元空間:像一些方法中的操作臨時對象等,直接使用物理內存;


  • 最初的永久代是需要在JVM堆內存里面進行劃分

GC流程

所有的數據都會保存在JVM的堆內存之中,但是在實際的開發之中經常會創建許多的臨時對象,也會有一些常駐對象存在,所以為了保證GC的性能問題,對于GC
的處理流程如下圖所示

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

  1. 當現在有一個新的對象產生,那么對象一定需要內存空間,于是現在就需要為該對象進行內存空間的申請;

  2. 首先會判斷伊甸園區是否有內存空間,如果此時有內存空間,則直接將新對象保存在伊甸園區;

  3. 但是如果此時伊甸園區的內存空間不足,那么會自動執行一個MinorGC操作,將伊甸園區的無用內存空間進行清理,清理之后會繼續判斷伊甸園區的內存空間是否充足?如果內存空間充足,則將新的對象直接在伊甸園區進行空間分配;

  4. 如果執行了Minor GC之后發現伊甸園區的內存依然不足,那么這個時候會進行存活區判斷,如果存活區有剩余空間,則將伊甸園區的部分活躍對象保存在存活區,那么隨后繼續判斷伊甸園區的內存空間是否充足,如果充足,則在伊甸園區進行新對象的空間分配;

  5. 如果此時存活區也已經沒有內存空間了,則繼續判斷老年區,如果此時老年區空間充足,則將存活區中的活躍對象保存到老年代,而后存活區就會存現有空余空間,隨后伊甸園區將活躍對象保存在存活區之中,而后在伊甸園區里為新對象開辟空間;

  6. 如果這個時候老年代也滿了,那么這個時候將產生M ajor GC(FullGC),進行老年代的內存清理。

  7. 如果老年代執行了Full GC之后發現依然無法進行對象的保存,就會產生OOM異常“OutOfMemoryError”

那么請思考“StackOverflowError”和“OutOfMemoryError”的區別是什么呢?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 作者:一字馬胡 轉載標志 【2017-11-12】 更新日志 日期更新內容備注 2017-11-12新建文章初版 ...
    beneke閱讀 2,232評論 0 7
  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虛擬機(JVM)垃圾回收器提供...
    簡欲明心閱讀 89,855評論 17 311
  • 原文閱讀 前言 這段時間懈怠了,罪過! 最近看到有同事也開始用上了微信公眾號寫博客了,挺好的~給他們點贊,這博客我...
    碼農戲碼閱讀 6,018評論 2 31
  • 一. 垃圾回收的意義 在C++中,對象所占的內存在程序結束運行之前一直被占用,在明確釋放之前不能分配給其它對...
    Stan_Z閱讀 1,963評論 0 25
  • JVM架構 當一個程序啟動之前,它的class會被類裝載器裝入方法區(Permanent區),執行引擎讀取方法區的...
    cocohaifang閱讀 1,699評論 0 7