深入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,249评论 0 7
  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供...
    简欲明心阅读 89,967评论 17 311
  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 6,040评论 2 31
  • 一. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对...
    Stan_Z阅读 1,970评论 0 25
  • JVM架构 当一个程序启动之前,它的class会被类装载器装入方法区(Permanent区),执行引擎读取方法区的...
    cocohaifang阅读 1,718评论 0 7