day3_垃圾回收器

news2024/11/28 7:32:53

文章目录

  • Serial回收器
  • ParNew回收器
  • Parallel Scavenge回收器
  • Serial Old回收器
  • Parallel Old回收器
  • CMS(Concurrent Mark Sweeping)回收器
  • G1

主要有7种垃圾回收器,如下所示:
在这里插入图片描述
其中有直线关联的表示,这2种垃圾回收器可以配合使用的。

Serial回收器

Serial收集器是一个单线程的垃圾回收器,所谓的单线程,就是说,只能由一个CPU或者一个线程来进行垃圾回收,同时,在进行垃圾回收的时候,会引发STW(stop the world),暂停其他线程继续运行
主要是用于新生代的,所采用的垃圾回收算法为标记复制算法

那么使用Serial回收器,对应的优点主要是,由于他是一个单线程的,那么就不存在线程交互的开销,可以专心做垃圾回收从而获得最高的单线程收集效率。但是他的缺点是会引起STW

ParNew回收器

ParNew回收器是Serial回收器的多线程版本,除了使用多线程进行回收之外,其他的用法基本和Serial回收器相同,例如所使用的回收算法一样都是标记复制算法,同样会引起STW等

并且ParNew回收器可以配合CMS回收器一起使用的,这个是它的唯一的优点

Parallel Scavenge回收器

Parallel Scavenge回收器主要是针对新生代的,所采用的回收算法是标记复制算法。并且注重吞吐量(吞吐量 = 用户运行代码所用的时间 / (用户运行代码所用的时间 + 垃圾回收所花的时间)),通常可以通过设置参数-XX:-XX:GCTimeRatio来控制吞吐量的大小,如果值为19,那么垃圾回收所占用的时间占总时间的5%(1 / (1 + 19))

在jdk 1.5之前,主要是和Serial Old配合使用的,而在之后,就和Parallel Old配合使用。其中Serial Old, Parallel Old同样是针对的老年代,并且采用的都是标记整理算法进行回收垃圾的

Serial Old回收器

Serial Old回收器是一个单线程的,并且是针对的老年代,采用的回收算法是标记整理算法
Serial Old回收器主要用在2个地方: 在jdk 1.5之前,配合Parallel Scavenge回收器使用,其次,作为CMS回收器的一个备选方案,在并发失败之后,就会退化,使用Serial Old回收器来进行回收

Parallel Old回收器

Parallel Old回收器是一个多线程的,并且针对的是老年代,采用的是标记整理算法回收垃圾的。并且在jdk 1.5之后,配合Parallel Scavenge回收器使用的。

CMS(Concurrent Mark Sweeping)回收器

CMS回收器针对的是老年代的一个回收器,所采用的回收算法是标记清除算法
对应回收的流程为:

  • 初始标记: 仅仅标记和GC ROOT直接关联的对象。会引发STW,也即会暂停其他所有的工作线程

  • 并发标记:标记GC ROOT能够到达的对象。它是和其他用户线程并发执行的

  • 重新标记:因为在并发标记阶段,其他的用户线程继续运行,此时就有可能导致标记记录发生了变动,所以需要重新标记这一部分变动的记录。同样会引发STW

  • 并发清理:将没有被标记的对象清除,是和其他的用户线程并发执行的,那么这时候同样可能会一些浮动垃圾(就是由用户线程运行,所产生的)。
    在这里插入图片描述
    使用CMS回收器存在的问题

  • 对处理器资源非常敏感。因为在并发标记的过程中,垃圾回收线程和其他的用户线程并发执行的,那么这时候CPU的利用率并没有完全利用起来(垃圾回收线程的数目 = CPU数量 * 1/4),也即是说,如果有4个CPU,那么就有1个CPU用来进行垃圾回收的

  • 无法处理“浮动垃圾”,有可能导致并发失败而导致一次Full GC

    所谓的浮动垃圾,就是说在并发清理的过程中,其他的用户线程继续运行,这时候就会产生一些垃圾对象,由于这部分垃圾对象是在标记过程之后才产生的,所以CMS回收器并不会在这次的GC操作中回收,而需要等到下一次GC操作才会将其回收。

    在进行并发清理的这个过程中,其他的用户线程继续运行。因此需要预留一定的内存空间给这些用户线程使用,对应的策略就是通过设置参数 -XX:InitatingOccupancyPercent,一旦超过了这个值,就会执行一次垃圾回收,避免发生Full GC
    预留的内存空间依然没有满足用户程序的需要,就会发生并发失败,此时就会使用CMS的备选方案,退化使用Serial Old回收器来进行回收

  • 采用的标记清除算法,会产生大量的内存碎片,最后导致由于没有连续的内存空间,分配给对象,而导致一次Full GC。所以需要通过设置参数-XX:CMSFullGCsBeforeCompaction,表示在进行多少次CMS回收后,进行一次内存压缩。(默认值为0,表示每次FullGC都进行碎片整理)

G1

G1同样拥有低延迟和吞吐量,并且拥有超大的内存,而且将内存分为若干个大小相同的Regin.
在整体上面使用的是标记整理算法,而2个Region之间使用的标记复制算法

G1回收器的对应流程:

  • 初始标记: 标记和GC ROOT直接关联的对象。会引发STW
  • 并发标记:标记存活的对象。和其他的用户线程并发执行。
  • 最终标记:由于在并发标记的这个过程中,其他的用户线程并发执行,所以会导致标记记录发生变动,因此需要重新标记这部分变动的记录。同样会引起STW。
  • 筛选回收:会将没有标记的对象中,筛选占用内存最大的对象进行回收。

对应的流程为:
在这里插入图片描述
但是在最终标记这个阶段,它是通过写屏障 和一个对象来实现的,从而避免漏标等情况,例如下面的例子:
在这里插入图片描述
但是由于并发清理和其他用户线程是并发执行的,所以这回收的过程中,如果用户线程将B中的某一个属性的引用,指向了D对象,如下所示:
在这里插入图片描述
所以上面的D本不应该被回收,但是被回收了。所以就有了重新标记,需要加入写屏障,在某一个对象的引用发生变动的时候,就会加入一个写屏障,同时将这个对象加入到一个队列中,将这个对象标记为灰色,然后让另一个线程来扫描这个对象,发现这个对象是灰色的,就将其标记为黑色。如下所示:
在这里插入图片描述
在这里插入图片描述

参考: https://www.cnblogs.com/Chary/p/14428356.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型之PaLM2简介

1 缘起 大模型时代。 时刻关注大模型相关的研究与进展, 以及科技巨头的商业化大模型产品。 作为产品&技术普及类文章,本文将围绕PaLM2是什么、特点、如何使用展开。 想要了解更多信息的可以移步官方网站提供的参考文档,后文会给出相关链…

Oracle11g服务说明

一、服务说明 1.OracleDBConsoleorcl:非必须启动 Oracle数据库控制台服务,orcl是Oracle的实例标识,默认的实例为orcl。在运行Enterprise Manager(企业管理器OEM)的时候,需要启动这个服务。 2.OracleJobS…

一文了解异步编程

promise 什么是promise promise是异步编程的一种解决方案,从语法上来说,Promise是一个对象,从它可以获取异步操作的消息 ES6规定,Promise对象是一个构造函数,接受一个函数作为参数,这个函数会立即执行&a…

Long类型返回前端精度丢失

【1】给前端返回Long会出现精度丢失问题 在《阿里巴巴Java开发手册》中,有一条关于前后端超大整数返回的规约,具体内容如下: 【2】问题复现 后端直接用postman测试接口,返回数据没有问题。但是前端访问接口的时候,发…

系统化了解Micrometer

本文从官方文档整理出一篇系统化全面了解的文章, 后续可能会慢慢补上源码层面的解析: https://micrometer.io/docs 学习本文的目的在于深入了解中间件的监控模块的设计, 先看看主流的做法于核心思想 本文的引用来的笔者的理解于备注 需要做的是: 先理解功能存在的理由设计模式…

kibana 代码执行 (CVE-2019-7609)

漏洞原理 “原型污染”是一种针对JS语言开发的攻击方法。JS语言中,每一个对象都是有其原型(proto)的,而该原型又有其自己的原型对象,直到某个对象的原型为null。而如果JS对其中定义的对象原型的属性读写缺乏控制&…

进程程序替换+简易版shell实现

索引 进程程序替换如何进行程序替换不同程序替换函数之间的区别系统接口调用其他语言的函数替换函数execle 简易版shell实现 进程程序替换 什么是进程程序替换? 指在一个正在运行的进程中,将原来的程序替换成新的程序的过程。 eg:如果我们想…

I IntelliJ IDEA 2023.1 最新解锁方式,支持java20,让Coding飞一会儿

IntelliJ IDEA 2023.1 最新变化 在 IntelliJ IDEA 2023.1 中,我们根据用户的宝贵反馈对新 UI 做出了大量改进。 我们还实现了性能增强,从而更快导入 Maven,以及在打开项目时更早提供 IDE 功能。 新版本通过后台提交检查提供了简化的提交流程…

Android不基于第三发依赖包解析shp文件(2)

接着上篇文章继续 2)Point (点)   一个 Point 由一对双精度坐标组成,存储顺序为 X,Y。    /*** PointGeometry记录读取* */static Geometry renderPointGeometry(byte[] recordContent,GeometryFactory geometryFactory) {int shapetype2

N轴机械臂的MDH正向建模,及python算法

目录 一、前言二、三维空间的坐标系变换三、MDH建模要点四、MDH的变换矩阵推导五、机械臂MDH的python模型六、python源码 一、前言 如果机器人工程师缺乏机器人学理论的支撑和足够的认识,那么随着机器人项目的深入推进,可能会越走越艰难,所谓…

【Lambda】集合的Lambda表达式

【Lambda】集合的Lambda表达式 【一】Stream的方法介绍【1】Stream里常用的方法【2】collect(toList()) & filter【3】map【4】flatMap【5】max&min【6】reduce 【二】常用案例总结【1】准备方法查询数据库获取List结果【2】取值【3】分组【4】去重【5】排序【6】list的…

uniapp制作水印相机给图片添加水印并且保存图片至本地

uniapp保存文件的三种方式 文件主要分为两大类: 1.代码包文件:代码包文件指的是在项目目录中添加的文件。 2.本地文件:通过调用接口本地产生,或通过网络下载下来,存储到本地的文件。 其中本地文件又分为三种&#…

【K8s】Service详解

文章目录 一、Service介绍1、认识Service2、kube-proxy的三种工作模式3、Service的类型 二、Service的使用1、实验数据准备2、Service类型为ClusterIP补充:Endpoints补充:负载分发策略 3、Service类型为HeadLiness3、Service类型为NodePort4、Service的类…

Ovito渲染技巧之体系边界识别

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material , 更 \color{red}{更} 更 多 \color{blue}{多} 多 精 \color{orange}{精} 精 彩 \color{green}{彩} 彩! 主要专栏内容包括: †《LAMMPS小技巧》: ‾ \textbf…

性能、性能还是性能---下一代Android性能框架分析

性能优化的重要性和难度毋庸置疑,事实上,性能优化也是一个永无止境的游戏,总会发现有一些东西需要优化。但是不可避免的是,这也是一个边际效益递减的事情,项目或应用获得的收益在一定程度上也会逐渐降低。What’s new …

ReentrantLock 原理

目录 ReentrantLock 概述 ReentrantLock 的原理 什么是 AQS ? 获取锁资源(以⾮公平锁为例) tryAcquire addWaiter acquireQueued 释放锁资源 ⾮公平锁体现在哪⾥? 调试代码 总结 ReentrantLock 概述 ReentrantLock是Lock接⼝的默认实现,是⼀…

【Linux】-关于Linux的指令(下)

💖作者:小树苗渴望变成参天大树 ❤️‍🩹作者宣言:认真写好每一篇博客 💨作者gitee:gitee 💞作者专栏:C语言,数据结构初阶,Linux,C 文章目录 前言一、时间相关的指令二、cal指令三、find -name指…

Centos7 经典模式安装GBase 8s 图文教程

Centos7安装GBase 8s 图文教程 前言1.1 硬件要求1.2 系统要求1.3 虚拟 PC 软件1.4 安装及配置数据库服务器1.4.1 创建 gbasedbt 组和用户1.4.2 创建 GBase 8s 数据库安装目录1.4.3 上传并解压安装包1.4.4 执行安装 参考文献 前言 本篇博文分享如何在Centos7 x86架构的系统中安…

第2章-Selenium-API操作

目标: 1. 熟练应用八种元素定位方式 2. 掌握对元素和浏览器的操作方法 3. 掌握键盘鼠标的操作 4. 掌握元素等待的操作 5. 掌握下拉选择框、 警告框和滚动条的操作 6. 掌握如何切换frame框架和多窗口 7. 掌握如何实现窗口截图 1.元素定位 1. 掌握id、 name、 cla…

【leetcode】622 二叉树的最大宽度

题目描述 给你一棵二叉树的根节点 root ,返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同&#…