jvm垃圾回收算法有哪些及原理

目录

  • 垃圾回收器
    • 1 Serial收集器
    • 2 Parallel收集器
    • 3 ParNew收集器
    • 4 CMS收集器
    • 5 G1回收器
    • 三色标记算法
      • 标记算法的过程
      • 三色标记算法缺陷
        • 多标
        • 漏标

垃圾回收器

垃圾回收机制,我们已经知道什么样的对象会成为垃圾。对象回收经历了什么——垃圾回收算法。那么谁来负责回收垃圾呢?

1 Serial收集器

-XX:+UseSerialGC -XX:+UseSerialOldGC

单线程执⾏垃圾收集,收集过程中会有较⻓的STW(stop the world),在GC时⼯作线程不能⼯作。虽然STW较⻓,但简单、直接。

新⽣代采⽤复制算法,⽼年代采⽤标记-整理算法。

在这里插入图片描述

由于Serial垃圾回收器是单线程的,因此它的优点是简单且占用资源较少;它适用于小型应用程序,例如移动应用程序和桌面应用程序。

2 Parallel收集器

-XX:+UseParallelGC,-XX:+UseParallelOldGC

使⽤多线程并行进⾏GC,会充分利⽤cpu,但是依然会有stw,这是jdk8默认使⽤的新⽣代和⽼年代的垃圾收集器。充分利⽤CPU资源,吞吐量⾼。

新⽣代采⽤复制算法,⽼年代采⽤标记-整理算法。

在这里插入图片描述

Parallel垃圾回收器适用于中等大小的应用程序,特别是那些需要高吞吐量的应用程序,例如: Web应用程序和大规模企业应用程
序。

3 ParNew收集器

-XX:+UseParNewGC

⼯作原理和Parallel收集器⼀样,都是使⽤多线程进⾏GC,但是区别在于ParNew收集器可以和CMS收集器配合⼯作。主流的方案:

ParNew收集器负责收集新生代,CMS负责收集老年代。

在这里插入图片描述

4 CMS收集器

-XX:+UseConcMarkSweepGC

⽬标:尽量减少stw的时间,提升⽤户的体验。真正做到gc线程和⽤户线程⼏乎同时⼯作。CMS采⽤标记-清除算法。

此处标记的是有用的对象。

  • 初始标记:暂停所有的其他线程(STW),并记录gc roots直接能引⽤的对象。

    例:线程栈帧的局部变量表中有个引用指向堆空间对象A,堆空间变量又引用了另一个对象B,则只记录A,不算B。

  • 并发标记:从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较⻓但是不需要STW,可以与应用线程⼀起并发运⾏。这个过程中,⽤户线程和GC线程并发,可能会有导致已经标记过的对象状态发⽣改变,所以下一步需要重新标记

    最后一句话是说会造成标记的遗漏:

    在这里插入图片描述

  • 重新标记:为了修正并发标记期间因为⽤户程序继续运⾏⽽导致标记产⽣变动的那⼀部分对象的标记记录,这个阶段的停顿时间⼀般会⽐初始标记阶段的时间稍⻓,远远比并发标记阶段时间短。主要⽤到三⾊标记⾥的算法做重新标记。

  • 并发清理:开启⽤户线程,同时GC线程开始对未标记的区域做清扫。这个阶段如果有新增对象会被标记为黑色不做任何处理。(最终被标记为白色的都是垃圾)

  • 并发重置:重置本次GC过程中的标记数据。

在这里插入图片描述

总结:

  • 这几步中,最费时间的是并发清理,所以采用了并发处理
  • 初始标记和重新标记两处采用STW形式,因为标记的速度很快
  • 重新标记采用STW模式,因为是最后一步标记,要确保标记到的必须都是用到的

5 G1回收器

用于大对象的回收,且jdk8版本对G1不是很完整

三色标记算法

标记算法的过程

再上述cms收集器中,采用到的算法就是三色标记法。

三色标记法会将内存中的对象分为白、灰、黑三种颜色,具体标记过程如下:

  1. 根据可达性分析算法,从 GC Roots 开始进行遍历访问。初始状态,所有的对象都是白色的,只有 GC Roots 是黑色的。

    在这里插入图片描述

  2. 初始标记阶段,GC Roots 标记直接关联对象置为灰色

    在这里插入图片描述

  3. 并发标记阶段,扫描整个引用链。

    • 没有子节点的话,将本节点变为黑色。

    • 有子节点的话,则当前节点变为黑色,子节点变为灰色。
      在这里插入图片描述

  4. 重复并发标记阶段,直至灰色对象没有其它子节点引用时结束。
    在这里插入图片描述
    在这里插入图片描述

扫描完成,此时黑色对象就是存活的对象,白色对象就是已消亡可回收的对象。

即(A、D、E、F、G)可达也就是存活对象,(B、C、H)不可达可回收的对象。

最终三种颜色对应的状态如下:
在这里插入图片描述

三色标记算法缺陷

三色标记算法,由于在并发标记阶段的时候,因为用户线程与 GC 线程同时运行,有可能会产生多标或者漏标

多标

假设已经遍历到 E(变为灰色了),此时应用执行了 objD.fieldE = null (D → E 的引用断开)。
在这里插入图片描述

D → E 的引用断开之后,E、F、G 三个对象不可达,应该要被回收的。然而因为 E 已经变为灰色了,其仍会被当作存活对象继续遍历下去。最终的结果是:这部分对象仍会被标记为存活,即本轮 GC 不会回收这部分内存。

这部分本应该回收但是没有回收到的内存,被称之为浮动垃圾。浮动垃圾并不会影响应用程序的正确性,只是需要等到下一轮垃圾回收中才被清除。

另外,针对并发标记开始后的新对象,通常的做法是直接全部当成黑色,本轮不会进行清除。这部分对象期间可能会变为垃圾,这也算是浮动垃圾的一部分。

漏标

假设 GC 线程已经遍历到 E(变为灰色了),此时应用线程先执行了:

var G = objE.fieldG; objE.fieldG = null; // 灰色E 断开引用 白色G objD.fieldG = G; // 黑色D 引用 白色G

在这里插入图片描述

此时切回到 GC 线程,因为 E 已经没有对 G 的引用了,所以不会将 G 置为灰色;尽管因为 D 重新引用了 G,但因为 D 已经是黑色了,不会再重新做遍历处理。

最终导致的结果是:G 会一直是白色,最后被当作垃圾进行清除。这直接影响到了应用程序的正确性,是不可接受的。

漏标只有同时满足以下两个条件时才会发生:

  • 一个或者多个黑色对象重新引用了白色对象;即黑色对象成员变量增加了新的引用。
  • 灰色对象断开了白色对象的引用(直接或间接的引用);即灰色对象原来成员变量的引用发生了变化。

也有方法可以解决:

需要在上面三个步骤中任意一个中,将对象 G 记录起来,然后作为灰色对象再进行遍历即可。比如放到一个特定的集合,等初始的 GC Roots 遍历完(并发标记),再重新标记阶段对该集合的对象遍历即可(重新标记)。

var G = objE.fieldG; // 1.读objE.fieldG = null; // 2.写objD.fieldG = G; // 3.写

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/151268.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VulnHub Metasploitable-2

一、信息收集 nmap扫描 访问80端口 二、漏洞利用 1.漏洞一 1.vsftpd 2.3.4(CVE-2011-2523) 2.msf msf6 > search vsftpd msf6 > use 0 msf6 exploit(unix/ftp/vsftpd_234_backdoor) > set rhosts 192.168.103.189 msf6 exploit(unix/ftp/vs…

R语言入门看这一章就够了(上)

目录 一、R的基础 1.1、R的安装 1.2、牛刀小试 1.3、线性关系实例 1.4、工作空间 1.5、R包的使用 包的安装 结果的重用 二、R数据集 2.1、向量 2.2、矩阵 2.3、数组 2.4、数据框 2.5、列表 三、R的常用命令 四、list列表详解 五、数据源导入方法 5.1、键盘输…

Mybatis-Plus(企业实际开发应用)

一、Mybatis-Plus简介 MyBatis-Plus是MyBatis框架的一个增强工具,可以简化持久层代码开发MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 官网&a…

Hadoop、Hive安装

一、 工具 Linux系统:Centos,版本7.0及以上 JDK:jdk1.8 Hadoop:3.1.3 Hive:3.1.2 虚拟机:VMware mysql:5.7.11 工具下载地址: https://pan.baidu.com/s/1JYtUVf2aYl5–i7xO6LOAQ 提取码: xavd…

TCP/IP(十七)实战抓包分析(一)ICMP

一 TCP实战抓包分析 网络排查案例 ① 抓包分析涉及的内容 关于: TCP理论知识和tcpdump命令的知识,前面已经铺垫过了,这里不再赘述下面罗列了TCP的重点知识 客户端工具: curl、wget、postman、telnet、浏览器、ncwget --bind-addressADDRESS 指定…

配置Super-VLAN下的DHCP服务器示例

组网需求 如图1所示,某公司拥有两个部门,为了节省IP地址,部门A和部门B规划为同一网段;为了提升业务安全性,将不同部门的用户划分到不同VLAN中。企业管理员为了方便统一管理,希望部门内终端通过DHCP服务器动…

UE4 使用材质后期 制作玻璃有雨效果

效果展示,其实这是一个动画效果 以上为所有逻辑 拿到TexCoord给到Panner,Time和Speed都是通过下面计算而来,后面讲,再拿到时间和速度值过后,加上扰动值,最后取G值,因为雨事从上而下的动&#xf…

STM32 定时器介绍

STM32F103系列单片机定时器主要有:系统定时器SysTick,2个高级定时器TIM1和TIM8,4个通用定时器TIM2/3/4/5,2个基本定时器TIM6和TIM7。下面先简单介绍一下: 基本定时器:基本定时器只能计时,不能产…

Postman的高级使用,傻瓜式学习【下】

目录 前言 1、全局变量、环境变量 1.1、概念: 1.2、如何设置全局变量、环境变量 1.3、获取全局变量、环境变量 1.4、案例1:手动设置变量,请求参数获取 1.5、案例2:代码设置变量,代码获取变量 2、Postman读取外部…

代码随想录算法训练营第三十五天丨 贪心算法part06

738.单调递增的数字 思路 暴力解法 题意很简单,那么首先想的就是暴力解法了【超时】。 贪心算法 题目要求小于等于N的最大单调递增的整数,那么拿一个两位的数字来举例。 例如:98,一旦出现strNum[i - 1] > strNum[i]的情况…

在VMware Workstation Pro安装win7

1.下载 地址 2.创建虚拟机 3.选择需要安装的系统镜像 4.选择系统版本 通常情况下选择 Windows 7 Ultimate 旗舰版,点击下一步,若提示产品密钥,则忽略 5.虚拟机命名 虚拟机保存位置保持默认即可,如果有需求可以更换位置 6…

C++之特殊类的设计

目录 一、单例模式 1、设计模式 2、单例模式 1、饿汉模式 2、懒汉模式 3、单例对象的释放问题 二、设计一个不能被拷贝的类 三、设计一个只能在堆上创建对象的类 四、设计一个只能在栈上创建对象的类 五、设计一个不能被继承的类 一、单例模式 1、设计模式 概念&am…