我们来聊聊垃圾收集器中相关术语与新生代收集器
yuyutoo 2024-10-11 23:55 8 浏览 0 评论
垃圾收集算法为实现垃圾收集提供了强有力的理论支持,而垃圾收集器则是利用了垃圾收集算法去实现垃圾回收的实践落地。
那么和垃圾回收算法类似,Java 也提供了多款垃圾收集器,不同的垃圾收集器也有不同的特性以及适用场景,甚至不同的垃圾收集器之间还可能存在配合使用的关系,那么使用起来还是比较复杂的。下图展示了 Java 里面比较主流的垃圾收集器以及能够作用的内存区域。
其中 Serial、ParNe、Parallel Scavenge 是作用于新生代的,而 CMS、Serial Old 、Parallel Old 作用于老年代。G1 既可以作用于新生代,也可以作用于老年代。连线表示垃圾收集器之间可以配合使用。
理解这张图,这样在你配置垃圾收集器的时候,一来可以避免配置了不能配合的垃圾收集器,比如你配置 CMS 和 Parallel Scavenge 是不能配合的。二来你也能够知道各种垃圾收集器所能够作用的内存区域。
好,接下来在正式探讨垃圾收集器这个话题之前,我们先来普及几个术语。
Stop The World
Stop The World 简写为 STW,也叫全局停顿。在 Stop The World 这个状态下,所有的 Java代码会停止运行,native 代码可以继续运行,但是它没有办法和 JVM 进行交互。
那么 Stop The World 多半是由于垃圾回收导致的,另外也可能是由 Dump 线程死锁检查、Dump 堆等等导致的。
我们试想,为什么在垃圾收集的时候会有 Stop The World 呢?可以这样想,我们的应用在运行的时候会产生大量的对象。那么可以做这样的对比,我们假设应用程序里面所产生的对象好比我们的聚会,那么聚会的时候会产生垃圾,然后垃圾收集器是清洁工负责打扫垃圾。如果你的聚会不停止,不断地产生垃圾的话,那么清洁工永远都别想打扫干净这个场地,只有让大家都停止活动,才可能把屋子打扫干净。所以垃圾收集的时候会有 Stop The World。
那么 Stop The World 有什么危害呢?非常好理解,首先 Stop The World 的状态下,Java 代码都会停止运行。于是你的服务会停掉,你的请求不会有任何响应。直到应用从 Stop The World 状态出来之后,才会恢复响应。那么对于一些高可用的系统,比如有的应用它有主从模式,如果 Stop The World 持续的时间过长,甚至可能会引起主备切换。总而言之, Stop The World 对于生产环境的危害还是比较严重的,因此我们一般都需要尽量缩短 Stop The World 的时间。
并行收集 VS 并发收集
很多人搞不清楚并行和并发之间的区别,我们来看一下什么叫并行收集呢?
它指的是多个垃圾收集线程并行的工作,但是在垃圾收集线程工作的过程中,你的用户线程是处于等待状态的,也就是说在垃圾收集的阶段,有多个线程在回收垃圾,但是与此同时你的业务线程都在等待中。
那么什么是并发收集呢?它指的是你的用户线程和垃圾收集线程同时工作,这个叫并发收集。
吞吐量
吞吐量指的是 CPU 用于运行用户代码的时间和 CPU 总消耗时间的比值。
计算公式:吞吐量=运行用户代码的时间 /(运行代码的时间+垃圾收集时间)。
举个例子,有一个 JVM 总共运行了 100 分钟,垃圾收集花费了 1 分钟,那么吞吐量就是 99% 。
好,了解这几个术语之后,正式探讨 Java 里面的垃圾收集器。
Serial 收集器
先来探讨新生代里面收集器。
第一款垃圾收集器叫 Serial 收集器,也叫串行收集器。那么Serial 收集器是最基本的收集器,也是发展历史最悠久的收集器。它使用的是复制算法。执行过程大概如下图所示:
用户线程运行到一个安全点之后全部暂停,然后由一个垃圾收集线程去回收,垃圾回收完成之后,用户线程才能继续执行。
那么这个垃圾收集器有哪些特点呢?
首先这个垃圾收集器是单线程的。
第二,简单高效。简单很好理解,单线程的当然比较简单了。那么高效是什么意思呢?这里所谓的高效是和其他收集器单个线程的工作效率下相比的,由于 Serial 收集器是单线程的,所以它没有和其他线程交互的开销,专心去做垃圾收集,因此它相对其他的垃圾收集器,单线程的工作效率会相对高一些。
第三,用这个垃圾收集器回收垃圾的时候,工作线程全程暂停,直到收集结束,也就是说整个垃圾收集线程一直处于 Stop The World 的状态。
Serial 收集器适用于什么样的场景呢?
第一,一般来说,它比较适合用来运行一些客户端程序,那么事实上,当你的项目使用 Client 模式运行的时候,默认使用的就是 Serial 收集器。比如你有一个应用在启动的时候,java -client -java xxx,这样使用的就是 Serial 收集器
第二,它比较适合运行在单核机器上,比如说一些嵌入式低性能的机器上。
ParNew 收集器
ParNew 收集器可以认为是 Serial 收集器的多线程版本。因为这个收集器除使用多线程以外,其他特性和 Serial 收集器都是一样的。比如针对 ParNew 收集集的一些 JVM 参数、Stop The World 的表现以及垃圾数据算法都和 Serial 是一致的。ParNew 收集器集的执行过程大致如下图所示:
用户线程执行到安全点之后暂停,然后会有多个垃圾数据线程去回收,垃圾回收完之后,用户线程继续执行。
ParNew 收集器的特点是多线程。另外它可以使用这个参数: -XX:ParallelGCThreads 去设置垃圾收集的线程数,在不同运行环境下,根据 CPU 的核数,开启不同的线程数,从而达到最优的垃圾收集效果。
在多 CPU 时,比 Serial 收集效率高。同时收集过程暂停所有应用程序线程,单 CPU 时比 Serial 效率差。
ParNew 收集器主要用来和 CMS 配合使用。同时运行在Server模式下的虚拟机中首选的新生代收集器。
Parallel Scavenge 收集器
和 ParNew 收集器一样,Parallel Scavenge 收集器也是运行在新生代区域,属于多线程的收集器,但不同的是,ParNew 收集器是通过控制垃圾回收的线程数来进行参数调整,而 Parallel Scavenge 收集器更关心的是程序运行的吞吐量,所以也被称为是吞吐量优先收集器,即一段时间内,用户代码运行时间占总运行时间的百分比。并且采用的算法是复制算法,执行过程和ParNew 也是类似的。
Parallel Scavenge 收集器特点有哪些呢?
首先使用 Parallel Scavenge 收集器可以达到一个可控的吞吐量,Parallel Scavenge 收集器提供了两个参数去控制吞吐量。
第一,-XX:MaxGCPauseMillis:最大垃圾收集停顿时间,是一个大于 0 的毫秒数,比如你可以配置这个时间等于 100 毫秒,收集器将回收时间尽量控制在这个设定值之内,但是也不保证绝对不超过这个值。同时需要注意的是在同样的情况下,回收时间与回收次数是成反比的,回收时间越小,相应的回收次数就会增多,所以这个值并不是越小越好。
第二,-XX:GCTimeRatio:它用来设置吞吐量的大小,取值是(0, 100)之间的整数,表示垃圾收集时间占总时间的比率。假设我们把 GCTimeRatio 的值设成 n,那么系统花费在垃圾收集的时间不会超过 1/(1+n)。
那么 Parallel Scavenge 除提供了两个参数去控制存储量以外,还提供一个自适应垃圾收集的机制,你可以使用这个参数:-XX:+UseAdaptiveSizePolicy 去开启自适应垃圾收集策略,一旦开启自适应策略之后,就不需要设置新生代的大小 Eden 和 Survivor 区的比例(-XX:SurvivorRatio)、晋升老年代对象年龄(-XX:PretenureSizeThreshold)等细节参数了。虚拟机它会自动地根据系统的运行状况去收集性的监控信息,然后动态地调整这些参数,从而实现最优的停顿时间以及最高的吞吐量。
这种调节方式称为 GC 自适应的调节策略(GC Ergonomics)。自适应调节策略也是 Parallel Scavenge 收集器与 ParNew 收集器的一个重要区别。
所以经过分析,Parallel Scavenge 收集器存在一定的智能性,那么 Parallel Scavenge 适用于什么样的场景呢?它适用于比较注重吞吐量的场景。
简单总结一下本课时,本课时我们主要学习了垃圾收集器相关的术语以及新生代中三个收集器,详细介绍了使用场景、特点以及使用的场景。
相关推荐
- Mysql和Oracle实现序列自增(oracle创建序列的sql)
-
Mysql和Oracle实现序列自增/*ORACLE设置自增序列oracle本身不支持如mysql的AUTO_INCREMENT自增方式,我们可以用序列加触发器的形式实现,假如有一个表T_WORKM...
- 关于Oracle数据库12c 新特性总结(oracle数据库19c与12c)
-
概述今天主要简单介绍一下Oracle12c的一些新特性,仅供参考。参考:http://docs.oracle.com/database/121/NEWFT/chapter12102.htm#NEWFT...
- MySQL CREATE TABLE 简单设计模板交流
-
推荐用MySQL8.0(2018/4/19发布,开发者说同比5.7快2倍)或同类型以上版本....
- mysql学习9:创建数据库(mysql5.5创建数据库)
-
前言:我也是在学习过程中,不对的地方请谅解showdatabases;#查看数据库表createdatabasename...
- MySQL面试题-CREATE TABLE AS 与CREATE TABLE LIKE的区别
-
执行"CREATETABLE新表ASSELECT*FROM原表;"后,新表与原表的字段一致,但主键、索引不会复制到新表,会把原表的表记录复制到新表。...
- Nike Dunk High Volt 和 Bright Spruce 预计将于 12 月推出
-
在街上看到的PandaDunk的超载可能让一些球鞋迷们望而却步,但Dunk的浪潮仍然强劲,看不到尽头。我们看到的很多版本都是为女性和儿童制作的,这种新配色为后者引入了一种令人耳目一新的新选择,而...
- 美国多功能舰载雷达及美国海军舰载多功能雷达系统技术介绍
-
多功能雷达AN/SPY-1的特性和技术能力,该雷达已经在美国海军服役了30多年,其修改-AN/SPY-1A、AN/SPY-1B(V)、AN/SPY-1D、AN/SPY-1D(V),以及雷神...
- 汽车音响怎么玩,安装技术知识(汽车音响怎么玩,安装技术知识视频)
-
全面分析汽车音响使用或安装技术常识一:主机是大多数人最熟习的音响器材,有关主机的各种性能及规格,也是耳熟能详的事,以下是一些在使用或安装时,比较需要注意的事项:LOUDNESS:几年前的主机,此按...
- 【推荐】ProAc Response系列扬声器逐个看
-
有考牌(公认好声音)扬声器之称ProAcTablette小音箱,相信不少音响发烧友都曾经,或者现在依然持有,正当大家逐渐掌握Tablette的摆位设定与器材配搭之后,下一步就会考虑升级至表现更全...
- #本站首晒# 漂洋过海来看你 — BLACK&DECKER 百得 BDH2000L无绳吸尘器 开箱
-
作者:初吻给了烟sco混迹张大妈时日不短了,手没少剁。家里有了汪星人,吸尘器使用频率相当高,偶尔零星打扫用卧式的实在麻烦(汪星人:你这分明是找借口,我掉毛是满屋子都有,铲屎君都是用卧式满屋子吸的,你...
- 专题|一个品牌一件产品(英国篇)之Quested(罗杰之声)
-
Quested(罗杰之声)代表产品:Q212FS品牌介绍Quested(罗杰之声)是录音监听领域的传奇品牌,由英国录音师RogerQuested于1985年创立。在成立Quested之前,Roger...
- 常用半导体中英对照表(建议收藏)(半导体英文术语)
-
作为一个源自国外的技术,半导体产业涉及许多英文术语。加之从业者很多都有海外经历或习惯于用英文表达相关技术和工艺节点,这就导致许多英文术语翻译成中文后,仍有不少人照应不上或不知如何翻译。为此,我们整理了...
- Fyne Audio F502SP 2.5音路低音反射式落地音箱评测
-
FyneAudio的F500系列,有新成员了!不过,新成员不是新的款式,却是根据原有款式提出特别版。特别版产品在原有型号后标注了SP字样,意思是SpecialProduction。Fyne一共推出...
- 有哪些免费的内存数据库(In-Memory Database)
-
以下是一些常见的免费的内存数据库:1.Redis:Redis是一个开源的内存数据库,它支持多种数据结构,如字符串、哈希表、列表、集合和有序集合。Redis提供了快速的读写操作,并且支持持久化数据到磁...
- RazorSQL Mac版(SQL数据库查询工具)
-
RazorSQLMac特别版是一款看似简单实则功能非常出色的SQL数据库查询、编辑、浏览和管理工具。RazorSQLformac特别版可以帮你管理多个数据库,支持主流的30多种数据库,包括Ca...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
推荐7个模板代码和其他游戏源码下载的网址
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
-
- Mysql和Oracle实现序列自增(oracle创建序列的sql)
- 关于Oracle数据库12c 新特性总结(oracle数据库19c与12c)
- MySQL CREATE TABLE 简单设计模板交流
- mysql学习9:创建数据库(mysql5.5创建数据库)
- MySQL面试题-CREATE TABLE AS 与CREATE TABLE LIKE的区别
- Nike Dunk High Volt 和 Bright Spruce 预计将于 12 月推出
- 美国多功能舰载雷达及美国海军舰载多功能雷达系统技术介绍
- 汽车音响怎么玩,安装技术知识(汽车音响怎么玩,安装技术知识视频)
- 【推荐】ProAc Response系列扬声器逐个看
- #本站首晒# 漂洋过海来看你 — BLACK&DECKER 百得 BDH2000L无绳吸尘器 开箱
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)