前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM 学习笔记(4):内存分配与回收策略

JVM 学习笔记(4):内存分配与回收策略

作者头像
玛卡bug卡
发布2022-09-20 11:02:41
2020
发布2022-09-20 11:02:41
举报
文章被收录于专栏:Java后端修炼

1、对象优先在 Eden 区分配

一般情况下,对象都优先在新生代的 Eden 区中分配,当 Eden 内存不足时将会发起一次 Minor GC。

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

大对象指的是占用大量连续内存的 Java对象,例如长字符串、长数组等,这些大对象的内存分配可能会遭遇总空间充足但连续空间不足而无法分配的情况,或者在复制对象时产生高昂的成本,因此在 Serial 或者 ParNew 虚拟机中可以使用参数 -XX:PretenureSizeThreshold 来设置大对象的阈值,超过此值会直接进入老年代。

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

对于分代收集来说,判断对象进入老年代的依凭是对象的年龄,在对象头中会有标记对象年龄的计数器,对象每在 Survivor 区中熬过一次垃圾收集则年龄加一,当年龄达到阈值时会晋升如老年代中,可以通过参数 -XX:MaxTenuringThreshold 来设置年龄阈值。

4、动态对象年龄判定

为了适应内存实际情况,如果在 Survivor 中相同年龄所有对象大小的总和大于 Survivor 的一半,则大于或等于该年龄的对象可以直接进入老年代,无需达到阈值要求。

5、空间分配担保

在发生 Minor GC 之前,如果老年代连续空间大于新生代对象总大小 或者 历次新晋老的平均大小 时则会正常进行,否则会进行一次 Full GC。在这里老年代空间就是用来做 Survivor 的超额担保。

参考资料:•《深入理解Java虚拟机(第三版)》——周志明[1]

相关链接

[1] 《深入理解Java虚拟机(第三版)》——周志明: https://book.douban.com/subject/34907497/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java后端修炼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、对象优先在 Eden 区分配
  • 2、大对象直接进入老年代
  • 3、长期存活对象进入老年代
  • 4、动态对象年龄判定
  • 5、空间分配担保
  • 相关链接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档