JVM虚拟机垃圾回收机制

一、堆内存示意图

JVM虚拟机垃圾回收机制_第1张图片
在JDK1.8以后取消永久区,被元空间代替。

二、堆内存分区介绍

JVM虚拟机垃圾回收机制_第2张图片

三、新生区的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)空间的问题,标记清除以后会产生大量不连续的空间碎片,空间碎片太多可能会导致程序运行过程需要分配较大的对象时候,无法找到足够连续内存而不得不提前触发一次垃圾收集。

标记整理:

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

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

六、欢迎关注微信公众号

你可能感兴趣的:(java,JVM,java,java虚拟机)