java年轻代minor gc_jvm堆内存年轻代触发MInorGC和和老年代触发FullGC的场景分析

了解什么是内存碎片?

大量的实例对象在堆内存新生代中因为没有了栈内存的局部变量的引用,而成为新生代中需要被垃圾回收的垃圾对象.此时垃圾对象被回收之后,垃圾对象所占用的内存区域就成为了内存碎片.

了解什么是新生代的复制算法?

因为内存碎片的原因,可能导致大量的垃圾对象虽然被回收了.但是内存区域都是一小块一小块的,并不能被新产生的实例对象所使用.从而产生了内存浪费因此需要一种方法,能够将内存中存活的对象给移动到另一个块儿内存区域中,并且紧密排列,然后对剩下的批量对垃圾对象进行统一清除.然后新产生的对象就继续放到新的内存区域内,等到新内存区域同样满了的时候,就将该区域内的存活对象移动到上一块儿被清除过的内存区域中,然后全量回收垃圾对象. 两块儿内存区域各一半新生代内存.这就是复制算法.

复制算法缺点:

上面的描述,解决了内存碎皮的问题,但是产生了一个新的问题,就是两块儿区域来回倒腾的过程中,始终有一块儿内存区域被闲置.这样就同样会产生内存浪费.

复制算法优化:

采用三块儿内存区域,并且设置内存区域的比例为8:1:1,然后三者进行来回切换.   比例为8的叫Eden区(伊甸园区),比例为1的统称为Survivor区(存活区), 刚开始分配对象的时候以Eden区为主,等到快满的时候,将存活对象移动到Survivor1区,然后对Eden区进行MinorGC,然后下次实例化的对象将会继续放在Eden区,等到下次Eden区满的时候,就会将Eden区的对象和上次放在Survivor的存活对象批量移动到另一个Survivor2区,然后再对Eden区和Survivor1区进行垃圾对象的回收清空.以此循环往复,就能保证始终只有十分之一的内存区域被闲置,而十分之九的内存可以被使用.

为什么要设置新生代对象的年龄?

所以从一开始就可以设置新生代对象的年龄.通过-XX:MaxTenuringTreshold参数设置的低一点,默认值为15,比如这里我们设置为5.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值