Java对象历险记 [动图]

对象的分配和回收流程

如上图动画所示:html

一、优先在Eden区分配对象

  • Eden区空间不足,触发Minor GC,标记可回收对象,而后Eden区存活对象拷贝到往Survivor-From区,接下来清空Eden区;
  • 再次触发Minor GC,扫描Eden区和from区,把存活的对象复制到To区,清空Eden区和from区;
  • 若是在Minor GC复制存活对象到Survivor区时,发现Survivor区内存不够,则提早把对象放入老年代;

二、大对象直接进入老年代

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

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

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

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

**固定对象年龄判断:**默认的,存活对象在Survivor的From和To区来回交换15次后,若是对象最终仍是存活,就放入老年代。能够经过-XX:MaxTenuringThreshold参数来设置对象的年龄。数组

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

四、空间分配担保

为何须要分配担保:若是Survivor区存活了不少对象,空间不够了,都须要晋升到老年代,那么久须要老年代进行分配担保,也就是将Survivor没法容纳的对象直接进入老年代。jvm

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

JDK 6 Update 24前会根据HandlePromotionFailure参数判断是否容许担保失败,若是容许,则尝试一次Minor GC;不然,则进行Full GC。动画


本文做者: arthinkingcode

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

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

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


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

相关文章
相关标签/搜索