微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

原文地址:https://cloud.tencent.com/developer/article/2024220

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐