前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM虚拟机垃圾回收机制

JVM虚拟机垃圾回收机制

作者头像
万能青年
发布2019-08-30 14:40:31
3470
发布2019-08-30 14:40:31
举报

一、堆内存示意图

在JDK1.8以后取消永久区,被元空间代替。

二、堆内存分区介绍

三、新生区的MinorGC

新生区的GC主要采用复制算法。

HotSpot JVM把新生区分为三部分:1个Eden区和2个Survivor区,默认内存大小比例为8 : 1 : 1,一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区,对象在Survivor区中每熬过一次Minor GC,年龄都会增加1岁,当年龄增加到一定程度时,就会被移动到老年代中,因为年轻中的对象基本都是朝生夕死的,所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另一块上面,复制算法不会产生内存碎片。

在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区的“To”是空的,紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”区,而在“From”区中仍存活的对象会根据他们的年龄来决定去向,年龄达到一定值的对象都会被移动到老年代,没有达到年龄阈值的对象都会复制到“To”区域,经过这次GC后,Eden区和From区已经被清空,这个时候,From会和To交换角色,也就是原来的From变为To,现在的To变为From,不管怎样,都要保证To区是空的,MInor GC会一直重复这样的过程,直到To区被填满之后,会将所有对象移到老年代。

因为Eden区对象一般存活率较低,一般的,使用两块10%的内存作为空闲和活动区间,而另外80%的内存,则用来给新建对象分配内存的,一旦发生GC,将10%的活动区间与另外的80%中存活的对象转移到10%的空闲区域,接下来,,将之前90%的内存全部释放,以此类推。

四、老年代的GC算法

分为标记清除和标记整理。

标记清除:

原理:分为标记和清除两个阶段:通过引用链给所有存活的对象做个标记,然后回收所有没有标记的对象 和 清除存活对象的标记,等待下一次GC特点:(1)效率问题,标记和清除的效率都不高;(2)空间的问题,标记清除以后会产生大量不连续的空间碎片,空间碎片太多可能会导致程序运行过程需要分配较大的对象时候,无法找到足够连续内存而不得不提前触发一次垃圾收集。

标记整理:

原理:分为标记和整理两个阶段:标记和标记清除算法一样,整理的话让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。特点:不会产生空间碎片,但是整理会花一定的时间。

五、频繁收集新生区,较少收集养老区,基本不动元空间

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JavaArtisan 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档