当前位置: 首页 > news >正文

java八股文面试[JVM]——垃圾回收器

jvm结构总结

 

在这里插入图片描述

在这里插入图片描述

常见的垃圾回收器有哪些?

 

 

CMS(Concurrent Mark Sweep)

整堆收集器: G1

由于整个过程中耗时最长并发标记并发清除过程中,收集器线程都可以与用户线程一起工作,所以总体上来说,CMS收集器的内存回收过程是与用户线程一起并发地执行。老年代收集器(新生代使用ParNew)

参数控制:

-XX:+UseConcMarkSweepGC 使用CMS收集器
-XX:+ UseCMSCompactAtFullCollection Full GC后,进行一次碎片整理;整理过程是独占的,会引起停顿时间变长
-XX:+CMSFullGCsBeforeCompaction 设置进行几次Full GC后,进行一次碎片整理
-XX:ParallelCMSThreads 设定CMS的线程数量(一般情况约等于可用CPU数量)

cms是一种预处理垃圾回收器,它不能等到old内存用尽时回收,需要在内存用尽前,完成回收操作,否则会导致并发回收失败
  

G1是目前技术发展的最前沿成果之一,HotSpot开发团队赋予它的使命是未来可以替换掉JDK1.5中发布的CMS收集器

上面提到的垃圾收集器,收集的范围都是整个新生代或者老年代,而G1不再是这样。使用G1收集器时,Java堆的内存布局与其他收集器有很大差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔阂了,它们都是一部分(可以不连续)Region的集合。

在这里插入图片描述

每个Region被标记了E、S、O和H,说明每个Region在运行时都充当了一种角色,其中H是以往算法中没有的,它代表Humongous,这表示这些Region存储的是巨型对象(humongous object,H-obj),当新建对象大小超过Region大小一半时,直接在新的一个或多个连续Region中分配,并标记为H。

为了避免全堆扫描,G1使用了Remembered Set来管理相关的对象引用信息。当进行内存回收时,在GC根节点的枚举范围中加入Remembered Set即可保证不对全堆扫描也不会有遗漏了。

如果不计算维护Remembered Set的操作,G1收集器的运作大致可划分为以下几个步骤:

1、初始标记(Initial Making)

2、并发标记(Concurrent Marking)

3、最终标记(Final Marking)

4、筛选回收(Live Data Counting and Evacuation)

看上去跟CMS收集器的运作过程有几分相似,不过确实也这样。初始阶段仅仅只是标记一下GC Roots能直接关联到的对象,并且修改TAMS(Next Top Mark Start)的值,让下一阶段用户程序并发运行时,能在正确可以用的Region中创建新对象,这个阶段需要停顿线程,但耗时很短。并发标记阶段是从GC Roots开始对堆中对象进行可达性分析,找出存活对象,这一阶段耗时较长但能与用户线程并发运行。而最终标记阶段需要把Remembered Set Logs的数据合并到Remembered Set中,这阶段需要停顿线程,但可并行执行。最后筛选回收阶段首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划,这一过程同样是需要停顿线程的,但Sun公司透露这个阶段其实也可以做到并发,但考虑到停顿线程将大幅度提高收集效率,所以选择停顿。下图为G1收集器运行示意图:

G1收集器是基于标记整理算法实现的,不会产生空间碎片,可以精确地控制停顿,将堆划分为多个大小固定的独立区域,并跟踪这些区域的垃圾堆积程度,在后台维护一个优先列表,每次根据允许的收集时间,优先回收垃圾最多的区域(Garbage First)。

 垃圾回收器比较

在这里插入图片描述

垃圾回收器选择策略 

客户端程序 : Serial + Serial Old;

吞吐率优先的服务端程序(比如:计算密集型) : Parallel Scavenge + Parallel Old;

响应时间优先的服务端程序 :ParNew + CMS。
 

知识来源:

【2023年面试】jvm有哪些垃圾回收器,实际中如何选择_哔哩哔哩_bilibili

JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客

http://www.lryc.cn/news/140071.html

相关文章:

  • redis持久化机制 事务详解
  • java八股文面试[多线程]——有几种创建线程的方式
  • Desnet模型详解
  • clickhouse-压测
  • AI夏令营第三期用户新增挑战赛学习笔记
  • pdf转ppt软件哪个好用?推荐一个好用的pdf转ppt软件
  • Linux 内核函数kallsyms_lookup_name
  • 强化学习在游戏AI中的应用与挑战
  • 6 Python的异常处理
  • 【跨语言通讯】
  • Android 基础知识
  • Linux常用命令_帮助命令、用户管理命令、压缩解压命令
  • 解决 KylinOS “Could not get lock /var/lib/dpkg/lock”错误
  • PHP pdf 自动填写表单
  • Win2016Server绑定多网卡实现负载均衡
  • 微软宣布在 Excel 中使用 Python:结合了 Python 的强大功能和 Excel 的灵活性。
  • 学习心得03:OpenCV
  • ubuntu学习(五)----读取文件以及光标的移动
  • Python 数据分析——matplotlib 快速绘图
  • uniapp小程序位置信息配置
  • 《基于 Vue 组件库 的 Webpack5 配置》1.模式 Mode 和 vue-loader
  • 01.sqlite3学习——数据库概述
  • 视频集中存储/云存储平台EasyCVR国标GB28181协议接入的报文交互数据包分析
  • 容器技术,1. Docker,2. Kubernetes(K8s):
  • Jtti :sql server怎么备份数据库?
  • Stable Diffusion 系列教程 | 打破模型壁垒
  • Cypress 做 e2e 测试,如何在获得某个 checkbox 后先判断它是否被 check 然后再更改它的状态?
  • 基于PIC单片机温度-脉搏-DS18B20温度-液晶12864显示(proteus仿真+源程序)
  • 【C++进阶(一)】STL大法以及string的使用
  • leetcode做题笔记99. 恢复二叉搜索树