java虚拟机垃圾回收机制_聊聊Java虚拟机的垃圾回收机制

一、回收哪些区域的对象

垃圾回收主要针对Young Generation块和Old Generation块内存进行回收,YG用来放新产生的对象,经过几次回收还没回收掉的对象往OG中移动,对YG进行垃圾回收又叫做MinorGC,对OG垃圾回收叫MajorGC,两块内存回收互不干涉,先看看堆内存的结构:

堆的内存结构

垃圾回收器除了针对堆中的对象回收以外,也对其它虚拟机区域进行回收:虚拟机栈栈帧中本地变量表的对象引用对象

方法区:类的静态属性引用的对象和常量引用对象

本地方法栈的native方法引用对

二、哪些对象可以回收?引用计数法

大致的思路就是只要对象被互相引用,计数器就加1,否则减1。但是当存在互相引用的情况时,就没法进行回收,如图所示:对象互相引用

2.根搜索法

引用计数算法没发回收互相引用的对象,所以当前大多数收集器都采用根搜索算法判断对象是否回收,大致的原理就是对于每一个对象的引用顺着调用链都能找到一个GC Roots根,假设某个对象无法找到GC Roots根,表明对象已经不再使用,就可进行相应的算法进行回收。(如图所示)

三、垃圾回收算法

1.标记-清除算法

标记清除算法分为两个阶段,首先标记出所有需要回收的对象(通过引用计数或者跟搜索来确定可回收的对象),在标记完成后统一回收所有的标记对象。如下图所示:

主要缺点如下:

第一:效率问题,标记和清除的效率太低。

第二:标记-清除后会产生大量的不连续的内存碎片,这会导致,在进行大的对象分配的时候,由于空间不连续,从而找不到足够的内存而不得不进行一次垃圾回收。

2.复制算法

复制算法针对标记-清除的效率问题,从而将内存按照容量划分为大小相等的两块区域,每次使用一块内存区域,当某一块使用完了,则将存活对象全部复制到另外一块区域,将使用完的内存进行一次性全部回收,这使得不会产生内存碎片问题,从而提高了效率,而代价就是将原本的内存区域缩小了一半。如图所示:

比如我们常用的HotSpot虚拟机将堆划分为新生代和老年代,新生代常用的算法为复制算法,首先新的对象产生都存放在eden区,当该区域内存空间满时,触发一次GC将存活的对象复制到survivor区,当达到一定的年龄还存活的对象或者该区域空间不足时直接从survivor区通过分配担保机制进入老年代。

3.标记-整理算法

对于复制算法来说,当一个应用的对象存活率较高时,很容易出现复制次数过多,从而需要开辟更多的空间进行复制对象使用,对于老年代这种不适合进行复制算法。标记-整理相对于标记-清除基本思路大致一致,只不过它是先将需要回收的对象先进行标记,不立即清除,而是将所有存活的对象都移动到另一边统一进行回收。大致流程如下图:

四、垃圾收集器

1.Serial收集器此回收器是比较早的一代回收器,其特点是单线程回收,回收期间所有的工作线程停止工作,这种回收器效率最低,如图所示

串行收集器回收示意图

2.ParNew收集器并行回收器相比于串行回收器只是采用了多线程回收,可能一定程度提高了回收速度,但是这期间任务存在工作线程的停止工作,提现在一个接口上那就是响应时间变长或者卡顿。如图所示:

并行回收器示意图

3.CMS收集器CMS全称为标记-清除,可见采用的就是标记-清除算法进行垃圾回收,它主要是针对老年代的垃圾回收算法。如下图所示:

CMS收集器示意图

主要有以下几个过程组成:

01、初始标记

此阶段工作线程会暂停工作,将符合回收的对象进行GC Roots标记,速度较快。

02、并发标记

在第一次进行初始标记完以后,这个阶段会进行GC Roots的的引用链路搜索,这期间不会导致工作线程的停止。但是耗时相对比较长。

03、重新标记

在并发标记阶段由于在程序运行阶段会产生一些标记的变动,从而对这部分引用重新标记,这个阶段耗时相比第一个阶段稍微时间长一点。

04、并发清除

并发清除虽然不会导致用户线程的中断,但是耗时也是最长的阶段,这期间会出现引用的停顿。

4.G1收集器G1收集器采用的算法为标记-整理算法,毋庸置疑对于CMS这种回收器会产生大量的内存碎片,但是G1是不会产生空间碎片。另外它可以非常精确的控制应用的停顿,即在一个时间片内垃圾回收的时间是可以控制的,G1不会将堆进行分代,而是将整个堆进行划分成大小固定的区域,并在后台维护一个优先列表,每次根据允许的时间,回收垃圾最多的区域,从而保证了收集效率。

敬请关注“聊点源码”公众账号!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值