java虚拟机年轻代的gc

垃圾分贷收集

当前商业虚拟机的垃圾收集都采用“分代收集”(Generational Collection)算法,这种算法并没有什么新的思想,只是根据对象的存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,对象都是每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。

复制算法

由于年轻代的对象大多数都是朝生夕死,所以适合复制算法。它可以将可用内存分为2块区域,每次只使用其中的一块,当这一块使用完之后,就将还存活的对象复制到另一块中,然后再将已使用过的内存一次清理调。这样使得每次都只针对其中的一块内存进行回收,内存分配也不用考虑内存碎片化的情况了。复制算法如下图:这里写图片描述

年轻代中的gc过程

HotSpot JVM把年轻代分为了两部分:Eden区和Survivor区,默认比例为8:2。Survivor区又可以分为From Survivor和To Survivor区,其中From Survivor和To Survivor在GC的过程中是可以相互转化的。一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。

因为年轻代中的对象基本都是朝生夕死的(80%以上),所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。

由于新对象在Eden空间分配内存,如果Eden剩余内存小于20%,就会触发Minor GC。在GC开始的时候,对象只会存在于Eden区和From Survivor区,To Survivor”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置,默认是15)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,需要老年代进行分配担保,会将所有对象移动到年老代中。老年代要对这些对象担保,前提是老年代本身还有剩余的容量。不过每次会有多少对象进入老年代,在实际完成内存回收钱是无法预知的,所以只好取之前每一次回收晋升到老年代对象容量的平均值作为经验值,与老年代剩余空间比较,判断是否需要进行Full GC来让老年代腾出更多的空间。下面是年轻代回收过程图:
这里写图片描述

年轻代常见JVM参数

1.-Xmn

年轻代大小(1.4or lator),注意:此处的大小是(eden+ 2 survivor space)。与jmap -heap中显示的New gen是不同的。整个堆大小=年轻代大小 + 年老代大小。增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。用法-Xmn256m。-Xmn 与 -XX:NewSize的值等价。

2.-XX:NewRatio

-XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5,Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。

3.-XX:SurvivorRatio

设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10

4.-XX:MaxTenuringThreshold

如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代. 对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活 时间,增加在年轻代即被回收的概率该参数只有在串行GC时才有效.

5.-XX:MaxNewSize

年轻代最大值,用法XX:MaxNewSize=256m

6.-XX:NewSize

设置年轻代大小-XX:NewSize=256m

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值