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

垃圾回收器

垃圾回收器就是垃圾回收的实践者,随着JDK的发展,垃圾回收器也在不断的更迭,在不同的场合下使用不同的垃圾回收器,这也是JVM调优的一部分。

1.垃圾回收器的分类

  • 按线程可分为单线程(串行)垃圾回收器和多线程(并行)垃圾回收器。

  • 按工作模式可分为独占式和并发式垃圾回收器。

  • 按工作的区间可分为年轻代垃圾回收器和老年代垃圾回收器。

2.GC的性能指标

GC的性能主要看:

  1. 吞吐量,运行用户代码所占的总运行时间比例。

  2. 垃圾收集开销,垃圾收集所占总运行时间的比例。

  3. 暂停时间,在垃圾回收时,工作线程暂停总花费的时间。

  4. 对象的存活时间,一个对象从创建到被回收所经历的时间。

3.HotSpot的垃圾回收器

3.1CMS

CMS称Concurrent Mark Sweep,并发标记清除,它在垃圾清除时可以使工作线程和GC线程并发执行,所以在垃圾收集的过程中用户的体验感会好很多。

CMS垃圾回收的过程:

  1. 初始标记:工作线程暂停,GC标记线程单独工作。

  2. 并发标记:工作线程和GC线程一起执行。

  3. 重新标记:工作线程暂停,GC标记线程单独工作。

  4. 并发清理:工作线程和GC线程一起执行。

如下图所示:

 CMS的优点:

  • 可以做到并发收集,提升用户的体验感。

CMS的缺点:

  • CMS是基于标记——清除算法的,会存在内存碎片。

  • CMS在并发阶段,CPU资源有限,在并发执行下还是占用了一定的资源的,总吞吐量会变低。

  • CMS无法处理浮动垃圾。

4.三色标记算法

从CMS垃圾收集器开始,引入了三色标记算法,就是将对象的颜色分为了黑、灰、白三种颜色。

黑色:表示该对象确定为存活对象。

灰色:对象已经被扫描,但是还未扫描此对象下的引用。

白色:表示此对象不可达,为垃圾对象。

三色标记的过程:

  1. 初始确定GC Roots根为黑色对象。

  2. 将GC Roots根下关联的对象标记为灰色。

  3. 下一次扫描灰色对象,先将灰色变为黑色,之后将其下的引用标记为灰色。

  4. 一直重复,直到没有灰色对象。

  5. 黑色则为存活对象,白色为垃圾对象。

三色标记可能出现的问题:

漏标

 

        因为CMS中的工作线程和GC线程并发执行的,此时A确定为黑色,B,C为灰色,正常情况下下次应该扫描B了,但是假如此时A与B失去了关联引用,我们发现此时B为灰色,并不能立即直接列为垃圾对象(B就为浮动垃圾),而是需要等到下次GC扫描时,才会发现B是垃圾对象。

错标

        这种情况是B和D开始已经失去了关联,然后将D标记为白色,表示垃圾对象,此时如果突然A和D建立了引用,但是D已经标记为白色了,之后不在会扫描了,之后D就会被当为垃圾对象回收。

解决错标问题的策略:

        我们发现错标远比漏标更为严重,错标在同时满足下面两种情况时才会发生:

打破这两种情况的任意一种即可解决错标问题,即利用原始快照或者增量更新。

原始快照:在断开之时,快照将此引用保存下,之后这次扫描完,在以B根重新扫描一次。

增量更新:等建立联系之后,以A根再扫描一次。

5.G1(Garbage First)垃圾优先回收器

G1可以在延迟可控的情况下,尽可能多的增大吞吐量,是一款面向服务端的垃圾收集器,其将堆划分为多个小区域,对各区域内的垃圾数量进行实时检测,优先收集垃圾数量最多的,运用在内存较大的应用上。

6.JDK8默认使用的垃圾回收器

年轻代使用 Parallel Scavenge GC

老年代使用 Parallel Old GC

 

 

 

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

相关文章:

  • SpringBoot 读取配置文件的值为 Infinity
  • 学习笔记230827--vue项目中,子组件拿不到父组件异步获取数据的问题
  • sql:SQL优化知识点记录(三)
  • List<Map>操作汇总
  • 软考:中级软件设计师:网络类型与拓扑结构,网络规划与设计,ip地址与子网划分,特殊含义的IP地址
  • linux创建进程
  • 100天精通Golang(基础入门篇)——第19天:深入剖析Go语言中方法(Method)的妙用与实践
  • 【人工智能】—_不确定性、先验概率_后验概率、概率密度、贝叶斯法则、朴素贝叶斯_、最大似然估计
  • postgresql-字符函数
  • VUE笔记(五)网络通信
  • 微信小程序修改数据,input不能实时回显
  • GitHub Copilot三连更:能在代码行里直接提问,上下文范围扩展到终端
  • 双亲委派机制
  • 美团北极星榜单,服务零售的医美新样本
  • geant4 常用代码
  • 重要通知!eBay将升级买家满意度考核,如何让你的店铺脱颖而出?
  • PHP中pack、unpack的用法
  • KUKA机器人零点标定的具体方法
  • 基于SpringBoot+Vue的旅游系统
  • leetcode算法题--复杂链表的复制
  • C++面试题(叁)---操作系统篇
  • 算法笔记:KD树
  • plumelog介绍与应用-一个简单易用的java分布式日志系统
  • 百度网盘删除“我的应用数据”文件夹
  • 多店铺智能客服,助力店铺销量倍增
  • 会话跟踪技术
  • 递归算法学习——子集
  • 学习笔记:ROS使用经验(ROS报错)
  • 设计模式二十四:访问者模式(Visitor Pattern)
  • 使用gn+Ninja构建项目