JVM:垃圾收集器(7种)

news2024/9/21 14:36:44

垃圾收集器关系图:

如果两个收集器之间存在连线,就说明它们可以搭配使用。它们说在的区域则表示这个收集器属于新生代收集器还是老年代收集器。其中Serial(串行)、Parallel(并行)

1、Serial收集器

        Serial收集器是最基础、历史最悠久的收集器,是HotSpot虚拟机新生代收集器的唯一选择。这个收集器是一个单线程工作的收集器。这个收集器再进行垃圾收集时,必须停掉所有的工作线程,直到收集完成。这个停掉的工作是后台自己执行的,用户并不知情。这个是我们无法接受的。

        从上面的种种缺点看去似乎这个收集器已经被时代抛弃,没有优点。但是它依旧是HotSpot虚拟机运行再客户端模式下默认的新生代收集器。因为它有一个很大的优点简单而高效。再内存环境受限的环境,它是所有收集器里面的额外内存消耗最小的。一般来说分配给虚拟机管理的内存一般不会特别大,对于几十兆甚至一两百兆的新生代,Serial垃圾收集器的停顿时间完全可以控制再可接受范围。所以, Serial收集器对于运行在客户端模式下的虚拟机来说是一个很好的选择。

2、ParNew收集器

        ParNew收集器实质上是Serial收集器的多线程并行版本,出来可以同时多条线程进行垃圾收集外,其余行为几乎与Serial收集器一致。

         这个收集器明明没有太大的创新为什么能有怎么重要的地位呢,那就是因为它的搭档CMS收集器。CMS第一款真正意义上支持并发的垃圾收集器,它首次 实现了让垃圾收集线程与用户线程同时工作。但这个收集器只能Serial和ParNew这两个新生代收集器配合使用。这样奠定了ParNew的地位。随着G1收集器的产生,这一组合被逐渐取代,官方希望它能完全被G1所取代,ParNew和CMS从此只能互相搭配使用,再也没有其他收集器能够和它们配合了。也可以理解为从此以后,ParNew合并入CMS,成为它专门处理新生代的组成部分。ParNew可以说是HotSpot虚拟机中第一款退出历史舞台的垃圾收集器。

3、Parallel Scavenge收集器

        Parallel Scavenge收集器是一款新生代收集器,它基于标记复制算法实现。也是能够并行收集的多线程收集器。它独特的点在于它的注重点与其他收集器不同,CMS等收集器的关注点是尽可能的缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge的注重点是一个可控的吞吐量。

注重停顿时间的垃圾收集器适合注重用户良好体验的程序,而高吞吐量则是更高效的利用资源,尽快完成程序的运算任务,适合在后台不需要过多交互的程序。

这个收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间 的-XX:MaxGCPauseMillis参数以及直接设置吞吐量大小的-XX:GCTimeRatio参数。 -XX:

4、Serial Old收集器

        Serial Old是Serial收集器的老年版本,它是一个单线程收集器,使用标记整理算法。这个收集器的主要作用是再客户端模式下的HotSpot虚拟机使用。再服务端下一种是JDK5即以前与ParallelScavenge收集器搭配使用,另一种就是作为CMS收集器发生失败时的后背预案。

5、Parallel Old收集器

        parallel Old是parallel Scavenge收集器的老年版本,支持多线程并发收集,基于标记整理算法实现。出现在JDK6后。当注重吞吐量或者处理器资源稀缺的时候,都会优先考虑                parallel Scavenge+Parallel Old收集器这个组合。

6、CMS收集器 (并发收集、低停顿)

        CMS(Concurrent Mark Sweep)收集器是以获取最短回收停顿时间的为目标的收集器。注重服务的响应速度,希望系统停顿时间尽可能短,以给用户更好的交互体验。这个收集器是基于标记清除算法实现的。用于老年代的收集。

收集过程有四个阶段:1、初始标记        2、并发标记        3、重新标记        4、并发清除

        四个阶段中初始标记重新标记仍需要暂停所有的用户线程(Stop The World),但为什么说这个收集器也暂停了所有的线程,为什么还能做到停顿时间短呢。因为初始标记阶段只是标记GC Roots能直接关联的对象,这个过程很快。而并发标记时才进行沿GC Roots遍历所有对象,这个工作量说不小的,但这个过程并没有停顿用户线程,而是与其并发执行,如果再过程出现对象引用关系改变,则使用增量更新的方法将其标记。待重新标记阶段就是为了解决这个并发过程中因为改变而被标记的对象。这个阶段是要暂停用户线程的,但这部分的工作量也不大。最后全部标记玩就进入了并发清除的阶段了。这部分也是与用户线程并发进行的。

从整体上看来耗时长的并发标记和并发清除都没有暂停用户线程,所有可以说:从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

缺点: 

  1. CMS收集器对CPU资源很敏感。它虽然不会导致用户线程停顿,但也会因为占用一部分线程导致应用程序变慢。它默认启动的回收线程数是(核心线程数+3)/4,所以随着核心线程数的降低,CMS收集器的弊端会越来越明显。
  2. CMS是一款基于“标记-清除”算法实现的收集器,这意味着收集结束时会有大量空间碎片产生。空间 碎片过多时,将会给大对象分配带来很大麻烦,往往会出现老年代还有很多剩余空间,但就是无法找 到足够大的连续空间来分配当前对象,所以会提前导致Full GC的到来。
  3. CMS无法处理浮动垃圾(再清除阶段用户线程还在运行,产生的垃圾)。必须等到下次GC时才能清理,而且不能等到老年代满了后再清理,因为再清理过程中用户线程还在产生对象,所以要预留一定内存,提前开启垃圾清理。

7、G1收集器(Garbage First)

        G1是一种“停顿时间模型”的收集器,它能指定时间N,确保消耗再垃圾收集上时间大概率不超过N毫秒的目的。G1收集器一改之前的分区收集思想,开创了面对局部收集的设计思路。它将java堆划分为多个大小相等的独立区域Region。它可以面对堆内存任何部分组成回收集进行回收。这个模型回收哪块的衡量标准是哪块Region垃圾最多,再N毫秒内回收收益最大。这就是G1收集器的Mixed GC模式。

        再并发操作阶段,CMS收集器采用增量更新算法实现,而G1 收集器则是通过原始快照(SATB)算法来实现的。

收集过程:

  1. 初始标记:仅仅只是标记一下GC Roots能直接关联到的对象,需要暂停用户线程,但耗时很短。
  2. 并发标记:从GC Root开始对堆中对象进行可达性分析,递归扫描整个堆 里的对象图,找出要回收的对象,这阶段耗时较长,但可与用户程序并发执行。当对象图扫描完成以 后,还要重新处理SATB记录下的在并发时有引用变动的对象。 ·
  3. 最终标记:对用户线程做另一个短暂的暂停,用于处理并发阶段结束后仍遗留 下来的最后那少量的SATB记录。 ·
  4. 筛选回收:负责更新Region的统计数据,对各个Region的回 收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个Region 构成回收集,然后把决定回收的那一部分Region的存活对象复制到空的Region中,再清理掉整个旧 Region的全部空间。这里的操作涉及存活对象的移动,是必须暂停用户线程,由多条收集器线程并行 完成的。

        毫无疑问,可以由用户指定期望的停顿时间是G1收集器很强大的一个功能,设置不同的期望停顿 时间,可使得G1在不同应用场景中取得关注吞吐量和关注延迟之间的最佳平衡。当然这个值也得是一个可能的值,要是太低了,就会导致每次回收不了多少,回收次数增加。

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

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

相关文章

F - Digital Roots HUOJ

题目 The digital root of a positive integer is found by summing the digits of the integer. If the resulting value is a single digit then that digit is the digital root. If the resulting value contains two or more digits, those digits are summed and the pro…

Spring Boot 学习之——@SpringBootApplication注解(自动注解原理)

SpringBootApplication注解 springboot是基于spring的新型的轻量级框架,最厉害的地方当属**自动配置。**那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置 SpringBootApplication//标注在某个类上,表示这个类是SpringBoot…

大数据开发之Kafka(broker、消费者、eagle监控、kraft模式)

第 4 章:Kafka Broker 4.1 Kafka Broker工作流程 4.1.1 Zookeeper存储的Kafka的信息 1、查看zookeeper中的kafka节点所存储的信息 启动Zookeeper客户端 [atguiguhadoop104 zookeeper-3.5.7]$ bin/zkCli.sh 通过ls命令列出kafka节点内容 [zk: localhost:2181(CO…

Docker(六)数据管理

作者主页: 正函数的个人主页 文章收录专栏: Docker 欢迎大家点赞 👍 收藏 ⭐ 加关注哦! Docker 数据管理 这一章介绍如何在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式: 数据卷&…

【Java】JDBC练习

JDBC练习 环境准备 -- 删除tb_brand表 drop table if exists tb_brand; -- 创建tb_brand表 create table tb_brand (-- id 主键id int primary key auto_increment,-- 品牌名称brand_name varchar(20),-- 企业名称company_name varchar(20),-- 排序字段ordered …

Flink处理函数(3)—— 窗口处理函数

窗口处理函数包括:ProcessWindowFunction 和 ProcessAllWindowFunction 基础用法 stream.keyBy( t -> t.f0 ).window( TumblingEventTimeWindows.of(Time.seconds(10)) ).process(new MyProcessWindowFunction()) 这里的MyProcessWindowFunction就是ProcessWi…

STM32 GD32 瑞萨 psoc 等单片机 无线wifi蓝牙最佳解决方案

新联鑫威一系列低功耗高性价比sdio wifi/蓝牙combo的模块CYWL6208 , CYWL6312, CYW6209等可以搭配stm32 各种型号例如以下,支持sta/ap/apsta,双模蓝牙的应用,支持rt-thread, freertos, Azure RTOS, Linux, Android系统. 稳定强,功耗低&#x…

从规则到神经网络:机器翻译技术的演化之路

文章目录 从规则到神经网络:机器翻译技术的演化之路一、概述1. 机器翻译的历史与发展2. 神经机器翻译的兴起3. 技术对现代社会的影响 二、机器翻译的核心技术1. 规则基础的机器翻译(Rule-Based Machine Translation, RBMT)2. 统计机器翻译&am…

[ELK] ELK企业级日志分析系统

一、ELK 概述 1.1 ELK 简介与组件 ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。 ●ElasticSearch:是基于Lucene(一个…

文献分享四:(基础)Pyroelectric drift of integrated-optical LiNbO3 modulators

文献来源——S. M. Kostritskii, Yu. N. Korkishko, V. A. Fedorov & A. V. Yatsenko (2021) Pyroelectric drift of integrated-optical LiNbO3 modulators, Ferroelectrics, 574:1, 170-178, DOI: 10.1080/00150193.2021.1888062 本文分析了我们之所以需要偏置电路的原因…

Lua 快速入门 · 教程笔记

Lua语言快速入门 教程笔记 前言1. Lua 语言介绍2. Lua 语言基础之基本语法声明变量声明方法使用 if - else使用 for使用 while 3. Lua 语言基础之表4. Lua 语言基础之数组插入元素移除元素获取表的长度全局表 5. Lua 语言面向对象之复制表的方式面向对象实现继承和重写父类方法…

鸿蒙开发-UI-布局-线性布局

鸿蒙开发-序言 鸿蒙开发-工具 鸿蒙开发-初体验 鸿蒙开发-运行机制 鸿蒙开发-运行机制-Stage模型 鸿蒙开发-UI 鸿蒙开发-UI-组件 鸿蒙开发-UI-组件-状态管理 鸿蒙开发-UI-应用-状态管理 鸿蒙开发-UI-渲染控制 鸿蒙开发-UI-布局 文章目录 前言 一、基本概念 二、布局子元素 1.子元…

【数据结构与算法】1.时间复杂度和空间复杂度

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点&…

Java设计模式-UML与设计原则(1)

大家好,我是馆长!在正式讲解Java设计模式之前,馆长先整理了一些概要信息,方便大家了解和学习。了解这些技术和理论信息,可以为设计模式的讲解更加的透彻与易学。 简介 统一建模语言(Unified Modeling Langu…

【react】创建react项目+项目结构

使用create-react-app快速搭建开发环境 create-react-app是一个快速创建React开发环境的工具,底层由Webpack构建,封装了配置细节 npx create-react-app react_hm执行命令后开始创建 创建好执行cd react_hm npm start 当看到webpack compiled successfu…

(超详细)7-YOLOV5改进-添加 CoTAttention注意力机制

1、在yolov5/models下面新建一个CoTAttention.py文件,在里面放入下面的代码 代码如下: import numpy as np import torch from torch import flatten, nn from torch.nn import init from torch.nn.modules.activation import ReLU from torch.nn.mod…

Redis最新版本搭建主从环境,Redis主从复制环境搭建

一般网站搭建都会使用Redis做缓存,当单台Redis承受不住压力时,会考虑搭建Redis主从。在没有业务的情况下,一般不会一下子上来就去搭建Redis无中心集群 Redis主从复制环境搭建,前面跟部署单台Redis一致,只不过后面是从R…

【C++入门】STL容器--vector底层数据结构剖析

目录 前言 1. vector的使用 vector的构造 vector迭代器 vector空间相关的接口 vector 功能型接口 find swap insert erase 2. vector内部数据结构剖析 reserve push_back和pop_back size、capacity、empty、operator[ ]; insert和erase resize swap 拷贝构造和…

acwing讲解篇之92. 递归实现指数型枚举

文章目录 题目描述题解思路题解代码 题目描述 题解思路 本题相当于二叉树的深度优先遍历,树的第i层是第i个数选或不选 我们记录当前递归的深度deep 然后用state进行状态压缩,state第i位是1表示选第i个数,第i位是0表示不选第i个数 进行dfs 如…

【面试突击】硬件级别可见性问题面试实战(上)

🌈🌈🌈🌈🌈🌈🌈🌈 欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复…