内存分配策略

本贴最后更新于 2673 天前,其中的信息可能已经渤澥桑田

对象优先在新生代的 Eden 上分配

大对象直接进入老年代

大对象就是需要大量连续内存的 Java 对象,如长字符串与数组,大对象可能导致内存还有不少剩余空间时就触发 GC 以获取足够的连续空间来安置这个大对象,所以写程序尽量避免大对象,特别是短命大对象
1)为了避免在 Eden 和两个 Survivor 之间发生大量的内存拷贝,大对象直接在老年代分配(有个值可以设置-XX:PretenureSizeThreshold,大于这个值就当作大对象直接到老年代去)

长期存活的对象将进入老年代

新生代的对象每熬过一次 minor gc,年龄就增加 1 岁,当增加到一定程度(默认 15 岁)时,就会被晋升到老年代

动态对象年龄判定

也并不是年龄达到 15 岁才能进入老年代的,如果在 Survivor 空间中相同年龄所有对象大小总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代

空间分配担保

在发生 minor gc 时,因为检测完会有一部分对象进入老年代,所以虚拟机会先检测老年代的内存够不够(之前每次晋升到老年代的平均大小 > 老年代的剩余空间?),如果不够了,那么改为进行一次 full gc,如果内存还够,那么检查是否允许担保失败,如果不允许,那么还是进行一次 full gc(一般设置为允许担保失败以避免 full gc 过于频繁)

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • 对象
    11 引用 • 44 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...