前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >jdk(7) - JVM垃圾回收机制

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

作者头像
惊羽-布壳儿
发布2022-06-15 21:44:06
3780
发布2022-06-15 21:44:06
举报
文章被收录于专栏:惊羽-布壳儿惊羽-布壳儿

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 内存碎片问题

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

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

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

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 垃圾标记原理
  • 2. 垃圾回收算法
    • 2.1 复制清除法
      • 2.2 标记清除法
        • 2.3 标记整理法
        • 3. 垃圾回收器
          • 3.1 CMS
            • 3.2 G1
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
            http://www.vxiaotou.com