堆的分代

分代收集理论

分代收集理论是多个收集器的设计原则,它的具体内容是
  • 弱分代假说:大多数对象朝生夕灭,弹指一挥间,人生短暂

  • 强分代假说:熬过GC次数愈多的对象,在GC的过程中越难被消亡

  • 跨代引用假说:存在跨代引用的对象是非常少数的

      如果新生代的对象被老年代所引用,而jvm要进行 minorGC,
      这时就不得不在固定的GCroot之外,再遍历所有的老年代对象来保障
      ,这样会大大的降低GC的效率。所以可以在新生代中使用 RememberSet来
      存储老年代中存在跨代引用的内存,在minor时只需要通过RememberSet中
      的记录来对指定内存进行检查即可。
    
所有的一切都是为了提高效率,顾客真是上帝呀!收集器将堆分为不同的区域来存放不同分代年龄的对象(对象经历GC后存活下来的次数越多,年龄越大)。试想如果一块内存区域(新生代)存放那些朝生夕灭的对象,以较高的频率GC,而且每次GC时只需要标记那些少数存活的对象。将那些难以消亡的对象放在另一块区域(老年代),以较低的频率GC,那么这将大大改善GC的时间开销和空间的有校利用。每次在新生代GC后存活的对象会逐步升级到老年代
根据分代的GC类型
  • minor GC:只对新生代的GC
  • major GC:只对老年代的GC
  • Full GC:对整个堆的GC
  • Mixed gc:对新生代和部分老年代的GC

新生代的内存分配

  • Eden空间
  • From 空间
  • To 空间:from ,to 均是survivor区域
Eden 和 survivor的比例是 8:1,每次只使用eden和一个survivor(from),所有的对象主要在eden中分配内存。当GC时Eden中存活的对象将被复制到to survivor区域,而from survivor区域则根据对象的年龄决定复制到老年代还是to survivor,一般当 年龄达到 15则复制到老年代。然后清空 eden和from区,from 和 to交换身份。这样保障了一次GC后 Eden和to区总是空的。当to区被填满后,所有的对象会进入到老年代
分配担保:当to survivor不足以容纳一次GC后eden和from中存活的对象,
通过分配担保,对象直接进入老年代

survivor存在的意义何在?

试想如果新生代中没有survivor和eden的划分,对象直接在整新生代分配内存,那么每一次GC存活的对象进入老年代很快老年代会被填满,触发 full GC,而老年代的内存远大于新生代,这时GC所消耗的时间将会非常长。这样就造成了GC效率低。当然也又解决办法,一是减小老年代的内存来缩短GC的时间,但是这样会增加GC的次数。二是增加老年代的内存来减少GC的次数,但是会增长GC的时间。由此可见新生代的eden,survivor划分不失为一种比较良好的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值