如上图动画所示:html
若是发现须要大量连续内存空间的Java对象,如很长的字符串或者数组,则直接把对象放入老年代。java
可经过-XX:PretenureSizeThreshold
参数设置大对象的最小大小,该参数只对Serial和ParNew两款收集器有效。算法
- 由于新生代采用复制算法收集垃圾,大对象直接进入老年代,避免在Eden区和Survivor区发生大量内存复制;
- 写程序的时候尽可能避免大对象。
**固定对象年龄判断:**默认的,存活对象在Survivor的From和To区来回交换15次后,若是对象最终仍是存活,就放入老年代。能够经过-XX:MaxTenuringThreshold
参数来设置对象的年龄。数组
**动态对象年龄判断:**若是发现Survivor中有相同年龄的对象空间总和大于Survivor空间的一半,那么年龄大于或者等于该年龄的对象直接晋升到老年代。架构
为何须要分配担保:
若是Survivor区存活了不少对象,空间不够了,都须要晋升到老年代,那么久须要老年代进行分配担保,也就是将Survivor没法容纳的对象直接进入老年代。jvm
JDK 6 Update 24前会根据
HandlePromotionFailure
参数判断是否容许担保失败,若是容许,则尝试一次Minor GC;不然,则进行Full GC。动画
本文做者: arthinkingcode
本文连接: www.itzhai.com/jvm/java-ob…cdn
版权声明: 本博客全部文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
更多垃圾回收机制,垃圾回收算法以及垃圾收集器相关文章,欢迎关注个人公众号:Java架构杂谈