Java对象历险记 [动图]

如果发现需要大量连续内存空间的Java对象,如很长的字符串或者数组,则直接把对象放入老年代。

可通过 -XX:PretenureSizeThreshold 参数设置大对象的最小大小,该参数只对Serial和ParNew两款收集器有效。

  • 因为新生代采用复制算法收集垃圾,大对象直接进入老年代,避免在Eden区和Survivor区发生大量内存复制;
  • 写程序的时候尽量避免大对象。

3、长期存活对象进入老年代

**固定对象年龄判断:**默认的,存活对象在Survivor的From和To区来回交换15次后,如果对象最终还是存活,就放入老年代。可以通过 -XX:MaxTenuringThreshold 参数来设置对象的年龄。

**动态对象年龄判断:**如果发现Survivor中有相同年龄的对象空间总和大于Survivor空间的一半,那么年龄大于或者等于该年龄的对象直接晋升到老年代。

4、空间分配担保

为什么需要分配担保: 如果Survivor区存活了很多对象,空间不够了,都需要晋升到老年代,那么久需要老年代进行分配担保,也就是将Survivor无法容纳的对象直接进入老年代。

  • 发生Minor GC前,JVM先检查老年代最大可用连续空间是否大于新生代所有对象的总空间
    • 大于:空间足够,直接Minor GC;
    • 小于:进行一次Full GC

JDK 6 Update 24前会根据 HandlePromotionFailure 参数判断是否允许担保失败,如果允许,则尝试一次Minor GC;否则,则进行Full GC。

本文作者: arthinking

本文链接: www.itzhai.com/jvm/java-ob…

Java对象历险记 | 分配担保,空间分配

版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

更多垃圾回收机制,垃圾回收算法以及垃圾收集器相关文章,欢迎关注我的公众号:Java架构杂谈

Java对象历险记 [动图]

原文 

https://juejin.im/post/5e1dcfcd6fb9a0301942f25c

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java对象历险记 [动图]

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址