侧边栏壁纸
博主头像
惊羽博主等级

hi ,我是惊羽,前生物学逃兵,现系统工程沉迷者 . 贝壳签约工程师 , 曾被雇佣为 联拓数科 · 支付研发工程师 、京东 · 京东数科 · 研发工程师、中国移动 · 雄安产业研究院 · 业务中台技术负责人 .

  • 累计撰写 101 篇文章
  • 累计创建 14 个标签
  • 累计收到 14 条评论

jdk(7) - JVM垃圾回收机制

惊羽
2021-06-21 / 0 评论 / 0 点赞 / 119 阅读 / 1,089 字
温馨提示:
本文为原创作品,感谢您喜欢~

1. 垃圾标记原理

GC ROOT , 通过引用标记来识别哪些是垃圾
GC ROOT 范围 : 被栈中声明引用的,被方法区内静态变量声明引用的 等

2. 垃圾回收算法

2.1 复制清除法

两块内存,一块用于空闲,一块用于使用,当被使用的内存占满后,将未被标记的转移到空闲内存,互换两块内存的角色,达到循环复制,清理掉垃圾的目的;(有碎片,但是快)

2.2 标记清除法

标记需要被清理的,然后stw清理被标记为垃圾的内存(有内存碎片产生,造成浪费)

2.3 标记整理法

标记需要被清理的,然后进行整理将未被标记的内存整理到连续的内存区域,在进行清理(没有内存碎片)

3. 垃圾回收器

3.1 CMS

CMS 针对老年代的回收器,主要流程为

1、初始标记(CMS initial mark)。

2、并发标记(CMS concurrent mark)。

3、最终标记(CMS remark)。

4、并发清除(CMS concurrent sweep)。

其中 ,初始标记 , 最终标记 需要 STW;

缺点 : 采用标记清理算法,会产生内存碎片
补偿 : 可通过启动参数,指定每隔一段时间进行一次碎片整理
问题 : 如何处理CMS 内存碎片问题

1 增大Xmx或者减少Xmn
2 在应用访问量最低的时候,在程序中主动调用System.gc(),比如每天凌晨。
3 在应用启动并完成所有初始化工作后,主动调用System.gc(),它可以将初始化的数据压缩到一个单独的chunk中,以腾出更多的连续内存空间给新生代晋升使用。
4 降低-XX:CMSInitiatingOccupancyFraction参数以提早执行CMSGC动作,虽然CMSGC不会进行内存碎片的压缩整理,但它会合并老生代中相邻的free空间。这样就可以容纳更多的新生代晋升行为

3.2 G1

G1 针对老年代和年轻代的回收器,主要流程为

1、初始标记

只标记GC ROOT 直接引用的对象

2、并发标记

GC ROOT 的直接饮用对象 tracing 过程

3、最终标记

修整并发过程中的已经释放的垃圾

4、并发清除

根据设置的预期时间进行最大垃圾优先原则回收

其中 ,初始标记 , 最终标记 需要 STW;

相比于 CMS 的优点 : ① 不会产生内存碎片 ② 可比较精准的控制停顿时间(在启动参数进行指定,在最终回收时会根据时间来进行非全量回收)

0
广告 广告

评论区