JVM中堆的区域划分

在这里插入图片描述

为什么堆要进行分代设计?

最大的原因就是为了解决GC后内存地址不连续的问题,也就是为了防止出现过多的空间碎片。因为在GC之前,会基于不可达算法对JVM中不可达的对象进行标记,然后GC时回收这些标记对象的内存空间,由于这些标记对象在内存中不是连续存在的,所以GC后会出现很多不连续的未被分配的内存空间。

为什么要有两个Survivor区?

也是为了解决内存地址不连续的问题,如果只有一个Survivor区,当新建的对象扔到Eden区,如果Eden区满了就会触发YongGC(Mirror GC),然后Eden区存活的对象扔到Survivor区,然后释放Eden区的这部分存活对象内存空间,当下一次Eden区满了,再想往Survivor区放存活对象时,此时Survivor区也满了,那就需要将Survivor区域未存活的对象的内存释放掉,此时Survivor也会出现内存地址不连续的问题,所以需要两个Survivor区,当某个Survivor区满了,会将自己内部的存活对象扔到另一个Survivor区,然后释放自己的内存,然后去接收Eden区的存活对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值