JVM学习总结三——垃圾回收器
整两天再看调优分析的部分,发现实际运行环境下,还是要考虑配置垃圾回收器,所以这里就加一小章介绍一下。
首先来看一下HotSpot所支持回收期的关系图:

图中可以看到一共有7中垃圾回收器,以中间绿线为界,上边三个用于年轻代,下边三个用在年老代,而G1则老少通吃,黑线线表示两个回收器可搭配使用,红线则表示两者可以在同一区域交替使用。由于G1在JDK1.7才达到商用级别,而且目前线上环境也很少使用,在此不再介绍。下面我们来介绍一下其他六种:
Serial:从名字就能看出是串行的意思,该回收器是最早实现的,基于单线程,实现简单且效率高,但是进行垃圾回收是会造成“Stop-the-World”(STW),当回收内存区域较大时,就会造成程序响应时间变长。
ParNew:全名Parallel New Generation,也就是并行新生代垃圾回收期,该回收器实现与Serial基本上一样,只是采用多线程执行回收。
Parallel Scavenge:并行清理,也就是并行垃圾回收器。该回收器与ParNew的最大区别在于ParNew通常与CMS搭配,一般注重于减少垃圾回收的停顿时间,提高响应速度,而Parallel Scavenge则侧重于吞吐量的控制,又名"吞吐量优先"回收器(吞吐量 = 运行用户代码时间 /(运行用户代码时间 + 垃圾收集时间);响应时间影响用户体验,而吞吐量则影响CPU利用率,进而影响程序程序运算效率)。此外需注意,该回收器不能够和CMS搭配使用。
CMS:Concurrent Mark Sweep,是一个并发回收器,旨在减少垃圾回收的停顿时间。我们可以从其处理过程分析一下:
- 初始标记:该阶段只标记GC Root节点(见上一篇)直接引用的节点,会造成STW,但是时间很短。图中该阶段Object1、Object3、Object2标记
- 并发标记:该阶段是整个回收过程最耗时阶段,对于程序正在使用的对象,程序运行和标记交替进行,而程序未占用的则可以直接标记,这样程序整体对外停顿时间缩短(可以了解下并发的概念),减少了响应时间。该阶段图中Object1、Object3子树正常标记,而Object2子树并发标记。
- 重新标记:由于被程序占用的对象在一段时间后可能死掉,因此在并发标记结束后,可能有新对象死掉而未被标记,因此需要对这一部分重新标记。该阶段图中Object2子树需要重新标记。
- 并发清理:该阶段过程与并发标记类似。
CMS回收器的缺点主要在三方面:1、占用一部分CPU资源,导致吞吐量下降;2、由于并发过程是回收和程序运行交替进行,会产生一些新垃圾进入年老代而未被清理 ,当年老代满时引起Full GC(因此一般年老代要预留一部分空间供程序使用);3、标记-清理的缺点——空间碎片,因此要适时进行压缩。
Serial Old:没啥好说Serial的年老代版。
Parallel Old:Parallel Scavenge的年老代版。
下边我们来看一下几个垃圾回收器的各方面对比:
| 名称 | 区域 | 算法 | 适用情况 | |
| Serial | 串行 | 年轻代 | 复制 | 单CPU(或CPU较少)、小型客户端应用 |
| Parallel Scavenge | 并行 | 年轻代 | 复制 | 多CPU、吞吐量优先(后台处理、科学计算) |
| ParNew | 并行 | 年轻代 | 复制 | 多CPU、响应优先(web服务器等) |
| CMS | 并发 | 年老代 | 标记-清除 | 响应优先(web服务器等) |
| Serial Old | 串行 | 年老代 | 标记-整理 | 单CPU、小型客户端应用 |
| Parallel Old | 并行 | 年老代 | 标记-整理 | 多CPU、吞吐量优先(后台处理、科学计算) |
从上表我们可以总结:对于小型应用或是单CPU机上跑的应用,可采用Serial+Serial Old;对于web服务器等响应优先的应用:ParNew(Serial)+CMS;对于后台处理、科学运算之类的,可采用Parallel Scavenge+Parallel Old;当然,具体采用什么样的搭配,还是要结合具体使用环境确定。
到此结束,睡觉喽!
JVM学习总结三——垃圾回收器的更多相关文章
- JVM学习第二天(垃圾回收器和内存分配策略)大章
说道垃圾回收器大家应该都会有所了解,GC白,当然说道具体的可能就不是很清楚了,今天我们就来玩一玩; GC要做的事情: 第一步:确定堆中需要回收的对象; 第二步:什么时候回收; 第三步:怎样回收 为什么 ...
- 深入理解JVM(五)——垃圾回收器
轻松学习JVM(五)——垃圾回收器 上一篇我们介绍了常见的垃圾回收算法,不同的算法各有各的优缺点,在JVM中并不是单纯的使用某一种算法进行垃圾回收,而是将不同的垃圾回收算法包装在不同的垃圾回收器当中, ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- JVM学习(三)JVM垃圾回收
一.引用的分类 在了解JVM垃圾回收机制之前,了解一下对象的引用类型是非常必要的. 强引用:GC时不会被回收 软引用:描述有用但不是必须的对象,在发生内存溢出异常之前被回收 弱引用:描述有用但不是必须 ...
- 深入理解JVM虚拟机3:垃圾回收器详解
JVM GC基本原理与GC算法 Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Java深受大家欢迎的众多特性之一,能够帮助程 ...
- JVM学习总结二——垃圾回收算法
昨天总结了JVM内存分区相关的知识,这次我们将来了解下JVM的另一个核心知识点——垃圾回收算法.这一部分其实并不太难,如果对操作系统的内存处理算法有所了解,那么这部分算法其实只看名字就能明白,两者在原 ...
- JVM(五)垃圾回收器的前世今生
全文共 2195 个字,读完大约需要 8 分钟. 如果垃圾回收的算法属于内存回收的方法论的话,那本文讨论的垃圾回收器就属于内存回收的具体实现. 因为不同的厂商(IBM.Oracle),实现的垃圾回收器 ...
- JVM学习02:GC垃圾回收和内存分配
JVM学习02:GC垃圾回收和内存分配 写在前面:本系列分享主要参考资料是 周志明老师的<深入理解Java虚拟机>第二版. GC垃圾回收和内存分配知识要点Xmind梳理 案例分析1-(G ...
- [JVM 相关] Java 新型垃圾回收器(Garbage First,G1)
回顾传统垃圾回收器 HotSpot 垃圾收集器实现 Serial Collector(串型收集器) 使用场景,大多数服务器是单核CPU. 适用收集场景:1. 新生代收集(Young Generatio ...
随机推荐
- OSGI.NET 插件启动方法
在使用OSGI.NET框架来开发插件过程中,有时为了测试一个插件,或运行一个插件,需要启动主个插件,如果没有主窗口程序,那么该 如何启动一个插件,而不是再开发一个主窗口程序(那样是不是太麻烦,仅仅是为 ...
- dwr与ssh框架整合教程
(1)dwr与ssh框架整合教程dwr框架介绍. DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开 发人员开发包含AJ ...
- 学习联系 Java阶乘相关练习
题目一:一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度 double hou = 0.00008; for (int i = 1; i > 0; i++) { hou = ...
- 【Linux】freetds安装配置连接MSSQL
我使用的是freetds-0.91,下载地址:http://pan.baidu.com/s/1hq68rZY 安装编译(根据需要unixodbc): [root@zabbixserver / ]# t ...
- 使用/proc实现内核与用户空间通信
1. 前言 Linux内核空间与用户空间的通信可通过"/proc"目录的文件读写来实现,如果只是控制内核中的参数而不是传输较多数据的话,用“/proc”是很合适的.另外一种内核 ...
- PPTP --VPN配置
测试:1:根据上面的步骤4,在路由器里查看状态:2:手机热点,共享给你电脑,电脑拨号,进行测试. 参考:http://jingyan.baidu.com/article/90808022ddd6a ...
- Windows server 2008R2部署服务批量安装Windows7教程
利用Windows server 2008 R2下的Windows部署服务可以批量安装Windows 7,以下简称WDS. WDS需要用到域和dhcp.DNS服务,所以,基础环境必须要有域控制器,dh ...
- .NET Framework 中的字符编码
字符是可用多种不同方式表示的抽象实体. 字符编码是一种为受支持字符集中的每个字符进行配对的系统,配对时使用的是表示该字符的某些值. 例如,摩尔斯电码是一种为罗马字母表中的每个字符进行配对的字符编码,配 ...
- css3 文本效果
CSS3 文本效果 1 CSS3 文本阴影在 CSS3 中,text-shadow 可向文本应用阴影,能够规定水平阴影.垂直阴影.模糊距离,以及阴影的颜色.text-shadow: 5px 5px ...
- Sliverlight中PagedCollectionView的使用
最近项目中一直在和PagedCollectionView这个类打交道.通过它,我们可以以分页的形式自动处理并显示集合中的片段,尤其是和Pager控件配合的时候更能彰显其威力. PagedColecti ...