Java GC-常见垃圾回收器

news2024/11/27 14:48:42

目录

    • 前言
    • 一、垃圾回收器分类
    • 二、垃圾回收器介绍
      • 1、Serial 收集器
      • 2、ParNew 收集器
      • 3、Parallel Scavenge 收集器
      • 4、Serial Old 收集器
      • 5、Parallel Old 收集器
      • 6、CMS 收集器(多线程标记清除算法)
      • 7、G1 收集器
    • 三、项目中垃圾收集器选型

前言

      Java的垃圾回收器其作用是,用于回收程序在运行时所产生的垃圾对象(无引用的对象),因为Java程序一般情况下不用自己释放内存会交由垃圾回收器处理,针对不同业务可以选择不同的垃圾回收器,本文会对Java常见的几种垃圾回收器做介绍

一、垃圾回收器分类

  • Java的垃圾回收器大致可以按照三个维度划分,每种垃圾回收器都有自己的特点。
    按照所负责回收区域划分:新生代回收器,老年代回收器
    按照GC执行的资源成本划分:单线程回收,多线程回收
    按照与用户线程关系划分:需暂停用户线程,与用户线程并发
收集器回收区域收集算法回收器特征
Serial新生代标记-复制单线程
ParNew新生代标记-复制单线程
Parallel Scavenge新生代标记-复制单线程
Serial Old老年代标记-整理单线程
Parallel Old老年代标记-整理多线程
CMS老年代标记-清除并发多线程
G1
(JDK1.7推出,
JDK1.9默认垃圾回收器)
跨代回收整体:标记-整理
局部Region:标记-复制
并发多线程

在这里插入图片描述

二、垃圾回收器介绍

1、Serial 收集器

    这是一个单线程的垃圾回收器,即执行垃圾回收操作时只有一个GC线程工作,最重要的是在他执行GC过程中,必须全程暂停用户线程,也就是经常说的STW(Stop the world)问题,这是jvm最早期的收集器,虽然STW问题是确实是一个诟病,但是这种方案实现起来较简单,占用资源也是最小的,对应新生代内存比较小的应用中,相对比较适用,比如运行在客户端模式下的Java程序。
在这里插入图片描述

2、ParNew 收集器

    和Serial 收集器不同的是,这是一款多线程收集器,即有多条GC线程同时进行垃圾回收工作,剩余其他的特点和Serial 收集器基本无异,比如控制参数,回收算法,STW问题等,作为一款新生代收集器,常用来和CMS搭配使用,ParNew是激活CMS后默认的新生代收集器,由于多线程执行的原因,在单核CPU下,由于线程上下文的切换,该收集器的效果甚至不如Serial收集器,在多核CPU中才推荐使用。
在这里插入图片描述

3、Parallel Scavenge 收集器

    Parallel Scavenge与ParNew实现上差别不大,不同的是,该收集器的侧重点是虚拟机的吞吐量,吞吐量很好理解,即用户代码的执行时间占整个系统运行时间的比重,其中就包括GC时间。如果虚拟机运行期间GC消耗的时间,占用的资源相对较高,那吞吐量自然也就会下降。而Parallel Scavenge关注的就是吞吐量的可控,尽可能的减少GC时间,让用户线程执行更长的时间,一些交互性比较弱的应用,比如科学计算、批处理任务、订单流转等。
为了实现这个目标,Parallel Scavenge提供了一些参数:
-XX:MaxGCPauseMills 即“最大GC停顿毫秒值” , 该值设置的大小是以新生代回收空间为代价的,设置的值越小,意味着所能回收的空间也会越小,相应的GC频率自然会提高,这个时候未必会提高吞吐量,具体的设置多少,需要根据应用的实际场景来决定
-XX:GCTimeRatio 该参数的范围是大于0小于100的整数,意义是用户程序的运行时间和垃圾回收时间的比例,比如设置为99,那最大允许的垃圾回收时间为1%。
-XX:+UseAdaptiveSizePolicy 直译过来就是“自适应大小策略”,当这个参数被激活后,就不需要指定新生代、Eden和Survivor区的比例(-XX:SurvivorRatio)、晋升老年代对象大小(-XX:PretenureSizeThreshold)等参数,虚拟机会根据当前的运行状态,收集性能监控信息,动态调整这些参数以提供最合适的停顿时间和最大吞吐量。
在这里插入图片描述

4、Serial Old 收集器

    Serial Old 是 Serial 垃圾收集器年老代版本,它同样是个单线程的收集器,使用标记-整理算法,这个收集器也主要是运行在 Client 默认的 java 虚拟机默认的年老代垃圾收集器。
    在 Server 模式下,主要有两个用途:1. 在 JDK1.5 之前版本中与新生代的 Parallel Scavenge 收集器搭配使用。2. 作为年老代中使用 CMS 收集器的后备垃圾收集方案

  • 新生代 Serial 与年老代 Serial Old 搭配垃圾收集过程:
    在这里插入图片描述
  • 新生代 Parallel Scavenge/ParNew 与年老代 Serial Old 搭配垃圾收集过程:
    在这里插入图片描述

5、Parallel Old 收集器

    Parallel Old 收集器是Parallel Scavenge的年老代版本,使用多线程的标记-整理算法,在 JDK1.6才开始提供。在 JDK1.6 之前,新生代使用 ParallelScavenge 收集器只能搭配年老代的 Serial Old 收集器,只能保证新生代的吞吐量优先,无法保证整体的吞吐量,Parallel Old 正是为了在年老代同样提供吞吐量优先的垃圾收集器,如果系统对吞吐量要求比较高,可以优先考虑新生代 Parallel Scavenge和年老代 Parallel Old 收集器的搭配策略。
在这里插入图片描述

6、CMS 收集器(多线程标记清除算法)

    Concurrent mark sweep(CMS) 收集器是一种周期性老年代垃圾收集器,其最主要目标是获取最短垃圾回收停顿时间,和其他年老代使用标记-整理算法不同,它使用多线程的标记-清除算法。最短的垃圾收集停顿时间可以为交互比较高的程序提高用户体验。

  • CMS垃圾回收器垃圾回收主要分为4个阶段:
    • 1、初始标记:只是标记一下 GC Roots 能直接关联的对象,速度很快,仍然需要暂停所有的工作线程。
    • 2、并发标记:该阶段GC线程和应用线程并发执行,遍历初始标记阶段标记出来的存活对象,然后继续递归标记这些对象可达的对象。
    • 3、重新标记:为了修正在并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,仍然需要暂停所有的工作线程,但是因为在前面两个阶段已经将大部分对象已经标记,这一步虽然需要暂停用户线程,但是这个暂停时间也不会很长。
    • 4、并发清除:这个阶段就是真正的清除垃圾对象的阶段,和用户线程一起工作,不需要暂停工作线程,会将前几步标记的垃圾对象清除。
      在这里插入图片描述

7、G1 收集器

    (Garbage first)G1 垃圾收集器采用了分区(Region)的思路,将整个堆空间分成若干个大小相等的内存区域(1MB~32MB,且必须是2的幂),每个Region根据需要都可以称为新生代的Eden区、Suivivor区,或者老年代区,收集器能够对扮演不同角色的Region采用不同的策略去处理,这样无论是新创建的对象,还是已经存活了一段时间的对象都能获得良好的收集效果。

    同时Region还有一类特殊的humongous区域,专门用来存储大对象,只要超过了一个Region容量的一半就会被认为是大对象,如果对象长度超过了Region的大小,则会使用多个连续的humongous来存放,G1的大多数行为会把该区域当做老年代来看待。

    G1依然保留了新生代和老年代的概念,逻辑上分代,物理上分区,内存中新生代和老年代不是固定的,他们是一系列的“动态集合”,通过这个动态集合建立一个可预测的停顿时间模型,换句话说,G1的回收是建立在这个停顿时间模型上的。每次回收都是以Region为单位,让G1去跟踪每一个Region中垃圾的“价值大小”,比如回收空间大小和回收所需的时间,然后通过这个价值大小维护一个优先级的列表,每次根据用户设定允许的收集停顿时间,优先处理回收价值最大的那些Region,这种划分Region空间以及具有优先级的区域回收方式,使得G1在有限时间内尽可能获得更高的收集效率。

  • G1垃圾回收执行过程可分为以下四步:
    • 初始标记:标记gc roots直接关联的对象,修改TAMS指针的值,目的是下阶段并发回收时,能够继续正常的分配对象。这个阶段需要停顿用户线程,但是相对比较短暂。
    • 并发标记:从gc roots开始对对象图进行可达性分析,找到有回收的对象,这个阶段与用户线程并发。
    • 最终标记:对并发标记时引用发生变化的对象重新标记,通过原始快照的方式,毫无疑问,这阶段需要短暂暂停用户线程
    • 筛选回收:负责更新Region的统计数据,对各个Region的回收价值和成本进行排序,结合用户指定的停顿时间制定回收计划,可以自由选择任意多个region构成回收集,然后把决定回收的那一部分region中存活的对象复制到空的region中,再清理掉整个旧region空间,由于要移动对象,所以这个阶段也必须暂停用户线程,有多个收集器线程并行完成 。
      在这里插入图片描述
      通过以上过程可以看出,除了并发标记阶段,其他阶段都需要暂停用户线程,所以G1主要目标是在延迟可控的情况下获得尽可能高的吞吐量,希望在延迟和吞吐量之间达到一个平衡。

三、项目中垃圾收集器选型

  • 如何合理选择收集器(项目配置堆内存有关系):
    • 1、入门级别网站 0.5-1GB,可以使用单线程新生代:Serial、老年代:Serial Old
    • 2、有一定的访问量 1-4G,新生代:ParNew | Parallel Scavenge、老年代:Parallel Old
    • 3、并发适中 4G左右,新生代:ParNew | Parallel Scavenge、老年代:CMS(响应式优先)
    • 4、高并发项目8G以上,G1收集器(注重吞吐和响应时间)

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

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

相关文章

零基础学编程系列,从入门到精通,中文编程开发语言工具下载,编程构件容器件之控制面板构件用法

零基础学编程系列,从入门到精通,中文编程开发语言工具下载,编程构件容器件之控制面板构件用法 一、前言 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载…

银河麒麟 aarch64 Mysql环境安装

一、操作系统版本信息 组件版本操作系统Kylin V10 (SP3) /(Lance)-aarch64-Build23/20230324Kernel4.19.90-52.22.v2207.ky10.aarch64MySQLmysql-8.3.0JDK1.8.0_312 二、MySQL下载 官网下载地址:https://dev.mysql.com/downloads/mysql/ 三、MySQL 安装 3.1 删…

幻兽帕鲁一键迁移到服务器,本地迁移存档后为什么又需要重新创建角色?

最近很多人在玩幻兽帕鲁的时候,想要把本地游戏存档迁移到服务器上继续玩,有些朋友却发现通过阿里云或者腾讯云上的一键迁移导入之后,进入游戏后发现又要重头开始玩。 这是为什么呢?其中可能的原因,我想就是因为它们的一…

spring boot3x登录开发-上(整合jwt)

⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途。 目录 前置条件 jwt简介 导依赖 编写jwt工具类 1.配置项直接嵌入代码,通过类名.静态方法使用 2.配置项写到…

ROS2学习(一):Ubuntu 20.04 安装 ROS2(Galactic Geochelone)

文章目录 一、ROS2(Galactic Geochelone)介绍二、ROS2(Galactic Geochelone)安装1. 设置语言环境2. 配置ubuntu universe仓库3. 配置ros2 apt仓库4. 安装ros25. 安装情况测试 一、ROS2(Galactic Geochelone)介绍 官方文档 二、ROS2(Galactic Geochelone)安装 1. 设置语言环…

[嵌入式AI从0开始到入土]5_炼丹炉的搭建(基于wsl2_Ubuntu22.04)

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注:等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间,后期会考虑出视频教程,务必催更,以防我变身鸽王。 第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…

云上未来:探索云计算的技术变革与应用趋势

一、云计算的起源和演进 1.1 早期计算模型 在探讨云计算的起源和演进之前,理解早期的计算模型对于构建全面的视角至关重要。早期计算模型的发展奠定了云计算的基础,为其演进提供了技术和理念的支撑。 1.1.1 集中式计算模型 在计算技术的早期阶段&…

使用Python和HTTP代理进行API请求

Python,这个简单易学又功能强大的编程语言,在网络爬虫、数据分析、自动化任务等领域都有着广泛的应用。而当我们需要从外部网站获取数据时,API(应用程序接口)就成了我们的得力助手。但有时候,某些网站会对A…

问题:下面几个句子,是对排比修辞方法的论述,正确的是() #笔记#知识分享

问题:下面几个句子,是对排比修辞方法的论述,正确的是() A.排比是结构上相同或相似的短语或句子构成,成串排列,以增强语势 B.排比是侧重于同一词语或同一句子一再出现&a…

WordPress Plugin HTML5 Video Player SQL注入漏洞复现(CVE-2024-1061)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 0x02 漏洞概述 WordPress Plugin HTML5 Video Player 插件 get_v…

游戏视频录制软件推荐,打造专业电竞视频(3款)

随着游戏产业的快速发展,越来越多的玩家开始关注游戏视频录制软件。一款好的录制软件不仅可以帮助玩家记录游戏中的精彩瞬间,还可以让其与他人分享自己的游戏体验。接下来,我们将介绍三款热门的游戏视频录制软件,并对其进行详细的…

Electron实战(一):环境搭建/Hello World/打包exe

文章目录 Electron安装Node.jsNodeJs推荐配置开始Electron项目创建index.js文件创建src目录运行打包生成exe生成安装包踩坑 下一篇Electron实战(二):将Node.js和UI能力(app/BrowserWindow/dialog)等注入html Electron Electron是一个使用JavaScript, HT…

2024三掌柜赠书活动第八期:Web3与DAO:下一代互联网演进逻辑

目录 前言关于Web3和DAO关于《Web3与DAO:下一代互联网演进逻辑》编辑推荐内容简介作者简介精彩书评图书目录书中前言/序言《Web3与DAO:下一代互联网演进逻辑》全书速览结束语 前言 随着区块链技术的崛起,Web3和DAO成为了当前互联网领域炙手…

vivado 综合、时序分析

以下综合 运行完成后,将打开Synthesis Completed对话框,如下所示图形 选择其中一个选项: •运行实施:启动当前实施项目的实施设置。 •打开综合设计:打开综合网表、活动约束集和将目标设备集成到综合设计环境中&…

利用k8s Infra 容器,解决pod网络故障注入的问题

目录 一、infra容器作用 二、pod网络故障注入问题 三、充分利用pod infra容器 一、infra容器的作用 我们知道,在kubernetes中,pod中容器的资源隔离主要通过namespace和cgroup来实现。那如果我们需要为pod中的容器共享某种资源应该怎么做。kubernetes …

组合数学基础

隔板法 X 1 X 2 . . . X n m , X i > 0 X_1X_2...X_nm,\quad X_i>0 X1​X2​...Xn​m,Xi​>0 求方程解的个数 求方程解的个数 求方程解的个数 m 个球插入 n − 1 个板将 m 个球分成 n 份 m个球插入n-1个板将m个球分成n份 m个球插入n−1个板将m个球分成n份 方程…

如何排查常规软件问题 - 面向 Linux 初级用户的教程

笔者从 14 年做开源软件以来,接触了众多 Linux 新手用户,这里我为这类用户总结了一些常见的问题排查方法,希望能帮助到大家。如果你已经工作多年,对于下面提到的思路和方法应该非常熟悉,如果对某一条感到陌生&#xff…

视频美颜SDK开发指南:从入门到精通的技术实践

美颜SDK是一种强大的工具,它不仅仅可以让用户在实时视频中获得光滑的肌肤和自然的妆容,从简单的滤镜到复杂的人脸识别,美颜SDK涵盖了广泛的技术领域。 一、美颜SDK的基本原理 美颜SDK包括图像处理、人脸检测和识别、滤镜应用等方面。掌握这些…

瑞_23种设计模式_抽象工厂模式

文章目录 1 抽象工厂模式(Abstract Factory Pattern)1.1 概念1.2 介绍1.3 小结1.4 结构 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 总结4.1 抽象工厂模式优缺点4.2 抽象工厂模式使用场景4.3 抽象工厂模式 VS 工厂方法模式4.4 抽象工…

ywtool dhcp命令

一.dhcp功能介绍 就是通过脚本实现dhcp地址池的增、删、改、查这几个功能日志文件路径: /var/log/ywtools/ywtool-dhcp.log/usr/local/ywtools/config/config.ini中account参数(ywtool dhcp这个命令用的,但是这个命令只能配置1个地址池,所以这里面的参数没什么意义) 二.配置…