JVM垃圾回收算法理解3之复制算法与分代算法

复制算法

将内存分为两个区域,内存1和内存2,使用的时候只使用内存1,内存2 是空的,
在这里插入图片描述
当内存1进行垃圾回收的时候,将存活对象复制到内存2,将内存1中的所有的对象回收,然后在将内存2与内存1 进行角色互换,这个时候内存1中的就没有内存碎片的问题如下图
在这里插入图片描述
复制算法进行垃圾回收的时候,可以看内存中的垃圾对象多还是存活对象多,当垃圾对象多的时候使用复制算法比较划算

jvm年轻代内存空间模型使用的就是复制算法
在这里插入图片描述
jdk1.8 内存模型分为年轻代和老年代,年轻代分为一个Eden区和一个Survivor区,Survivor区分又分成两个相同大小的Survivor区,可以称为From和To区,在gc 的时候对象只存在Eden区和名为From 的Survivor区,To里面是没有对象的,也就是说在To里面使用的就是复制算法。在进行gc的时候,所有存活的对象都会被复制到To区,而在From区中中仍然活着的对象会根据他们的年龄值决定去向,年龄达到一定阈值(年龄阈值可以通过-XX:MaxTenuringTheshold来设置)的对象会被移动到老年代,没有达到阈值的对象会被复制在To区域;经过gc之后From和To区域已经被清空,这个时候From和To区域互换他们的角色(新的To区域就是上次gc前的Form区域,新的From就是上次gc前的To区域,不管怎么样都会保证Survivor中的To区域是空的),gc会一直重复这个过程直到To区域被填满然后将整个To区中的对象移动到老年代中;
复制算法的优缺点;在垃圾对象比较多的情况下效率很高,并且清理没有内存碎片;在垃圾比较少的时候不适合,比如老年代;在使用复制算法的时候内存总是被分为两块空间,在同一时刻只能使用一半,内存使用率较低

分代算法

前面所说的标记清除算法、标记压缩算法、复制算法等每个算法都有自己的优点和缺点谁也不能替代谁,所以根据垃圾回收对象的特点选择适用的算法才是最好的选择,分代算法其实就是这样,根据回收对象的特点进行选择,在JVM中,年轻代适用复制算法,老年代适用标记清除或者标记压缩算法(因为老年代中垃圾比较少存活的对象比较多)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值