• HotSpot虚拟机中的垃圾收集器
  • GC评价标准
  • GC调优
    • 响应时间
    • 吞吐量
  • 1.新生代收集器
    • Serial收集器
    • ParNew收集器
    • Parallel Scavenge收集器
  • 2.老年代收集器
    • Serial Old收集器
    • Parallel Old收集器
    • CMS收集器(Concurrent Mark Sweep)

HotSpot虚拟机中的垃圾收集器

7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。

GC实现目标: 准确、高效、低停顿、空闲内存规整.

GC评价标准

在评估一个GC时,有几个方面需要关注。

  • GC的停顿时间: 大部分GC执行时需要将应用程序停止以便内存保持一个一致的状态来进行回收,这会对应用程序的执行性能造成影响。
  • GC的吞吐量: 在不面向用户的应用程序中,可能并不关注停顿时间,而是关注总体的执行效率,这时GC的吞吐量可以理解为回收一定内存所需的时间。

GC调优

java应用调优一般关注两个指标:响应时间和吞吐量。

响应时间

响应时间指的是应用对请求的响应时间,如:

  • 一个桌面应用对时间的响应时间
  • 网站返回一个页面的时间
  • 数据库查询结果返回时间

对于专注于最小响应时间的应用,长时间停顿是无法接受的。

吞吐量

吞吐量专注于应用在一段时间的的最大工作量。如:

  • 给定时间内完成的事物数
  • 每小时批处理程序能够完成的任务
  • 每小时数据库可以完成的查询操作数

较长停顿时间在此情况下是可以接受的。比起低响应时间,吞吐量优先应用更看重一段时间内的表现。

1.新生代收集器

Serial收集器

 
工作区域
单线程/多线程
垃圾收集算法
 

Serial收集器

(Stop the World)

新生代 单线程 复制算法

Client模式下的默认新生代收集器。

进行垃圾收集时,必须Stop the world,直到它收集结束。

-XX:+UseSerialGC

ParNew收集器

 
工作区域
单线程/多线程
垃圾收集算法
 

ParNew收集器

(Serial收集器的多线程版本)

(Stop the World)

新生代 多线程 复制算法 Server模式下的默认新生代收集器

Parallel Scavenge收集器

 
工作区域
单线程/多线程
垃圾收集算法
 

Parallel Scavenge收集器

(Stop the World)

新生代 多线程 复制算法

吞吐量优先收集器

目标:控制吞吐量

吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)

吞吐量越高说明CPU时间利用率越高。

JVM参数:

-XX:MaxGCPauseMillis 控制最大垃圾收集时间

-XX:GCTimeRatio 控制吞吐量大小

-XX:+UseParallelGC -XX:+UseParallelOldGC

2.老年代收集器

Serial Old收集器

 
作用区域
单线程/多线程
垃圾收集算法
 

Serial Old收集器

(Stop the World)

老年代 单线程 标记整理算法 这个收集器的主要意义也是在于给Client模式下的虚拟机使用。

如果在Server模式下,主要两大用途:

(1)在JDK1.5以及之前的版本中与Parallel Scavenge收集器搭配使用

(2)作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用

Parallel Old收集器

 
作用区域
单线程/多线程
垃圾收集算法
 

Parallel Old收集器

(Stop the World)

老年代 多线程 标记整理算法

Parallel Old 是Parallel Scavenge收集器的老年代版本。这个收集器在1.6中才开始提供。

在JDK1.5以及之前的版本中,Parallel Scavenge+Serial Old(单线程),无法充分利用多CPU的处理能力。1.6之后,终于有了名副其实的“吞吐量优先“收集器组合:Parallel Scavenge + Parallel Old。

CMS收集器(Concurrent Mark Sweep)

 
作用区域
单线程/多线程
垃圾收集器算法
 
CMS收集器 老年代 多线程 标记-清除算法

目标:最短回收停顿时间

优点:并发收集,低停顿

缺点:

1)CPU资源敏感。

在并发阶段,虽然不会导致用于线程停顿。但会因为占用了一部分CPU资源,导致用户应用程序变慢,吞吐量降低。

2)无法处理浮动垃圾

并发清理阶段,用户线程仍旧在运行并产生垃圾,这些产生的垃圾此次收集无法清理。

因此,需要预留一部分内存用于并发清理时用户程序使用。

解决方法:

当预留的内存不够时,将发生Concurrent Mode Failure,JVM启动后备预案,临时启用Serial Old进行老年代垃圾收集

-XX:CMSInitiatingOccupancyFraction

3)内存碎片问题

解决方法:

-XX:CMSFullGCsBeforeCompaction 设置执行多少次不带压缩的Full GC后,运行一次带压缩的

(默认为0,表示每次Full GC都进行碎片整理)

CMS在老年代的整个过程分为4个步骤:

 
阶段
描述
1

初始标记

(Stop the World)

仅仅标记GC Roots能直接关联到的对象,速度很快
2

重新标记

(Stop the World)

修正并发标记阶段因用户程序继续运行而导致标记发生变动的那一部分标记记录。此阶段比初始标记阶段稍长,但远比并发标记阶段的时间短。
3 并发标记 对GC Roots非直接关联到的对象进行标记,在此阶段,并发标记线程与用户线程并发执行,标记可能发生变动
4 并发清除

深入理解JVM 垃圾收集器(上)的更多相关文章

  1. 深入理解JVM - 垃圾收集器

    垃圾回收主要是要解决3件事情: 那些内存需要回收? 如何回收? 什么时候回收? 那些内存需要回收 在强引用的情况下已经“死”了的对象就需要回收,在非强引用的情况下视情况回收.在java里面,几乎所有的 ...

  2. 深入理解JVM 垃圾收集器(下)G1收集器

    1.回顾CMS 1.1堆内存结构 1.2新生代GC 1.3老年代GC 2.G1收集器 2.1G1实现概览及使用场景 G1的推荐使用场景 2.2GC 2.2.1新生代GC 2.2.2老年代GC 老年代G ...

  3. 深入理解JVM - 垃圾收集器与内存分配策略 - 第三章

    引用计数算法——判断对象是否存活的算法 很多教科书判断对象是否存活的算法是这样的:给对象添加一个引用计数器,每当一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象 ...

  4. 【006】【JVM——垃圾收集器总结】

     Java虚拟机学习总结文件夹 JVM--垃圾收集器总结 垃圾收集器概览 收集算法是内存回收的方法论.垃圾收集据是内存回收的详细实现.Java虚拟机规范中对垃圾收集器应该怎样实现没有规定.不同的厂 ...

  5. 第五章 JVM垃圾收集器(1)

    说明:垃圾回收算法是理论,垃圾收集器是回收算法的实现,关于回收算法,见<第四章 JVM垃圾回收算法> 1.七种垃圾收集器 Serial(串行GC)-- 复制 ParNew(并行GC)-- ...

  6. JVM垃圾收集器(1)

    此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 说明:垃圾回收算法是理论,垃圾收集器是回收算法的实现,关于回收算法,见<第四章 JVM垃圾回收算法& ...

  7. GC垃圾回收 | 深入理解G1垃圾收集器和GC日志

    来源:并发编程网链接:http://ifeve.com/深入理解G1垃圾收集器/ G1 GC是Jdk7的新特性之一.Jdk7+版本都可以自主配置G1作为JVM GC选项:作为JVM GC算法的一次重大 ...

  8. 7种JVM垃圾收集器特点,优劣势、及使用场景

    今天继续JVM的垃圾回收器详解,如果说垃圾收集算法是JVM内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. 一.常见的垃圾收集器有3类 1.新生代的收集器包括 Serial PraNew Pa ...

  9. 第六章 JVM垃圾收集器(2)

    上一章记录了几种常见的垃圾收集器,见<第五章 JVM垃圾收集器(1)> 1.G1 说明: 从上图来看,G1与CMS相比,仅在最后的"筛选回收"部分不同(CMS是并发清除 ...

随机推荐

  1. GitHub上整理的一些工具【转】

    技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,关注软件开发领域 ...

  2. 如何阅读不同格式的Ubuntu/Linux帮助文档

    Ubuntu和Linux的帮助文档有各种各样的格式,下面简单说下如何阅读这些帮助文档. 1)通过man命令阅读软件或命令的manual page.例如阅读man命令的manual页面可使用如下命令: ...

  3. dns解决测试微信二级域名访问问题

    背景介绍: 1:解决本地不能通过域名访问问题: 2:解决微信设置二级域名且本地iis站点使用非80端口号问题: ps:网站中微信部分在global中设置了重定向,代码已经修改为必须通过“wechat. ...

  4. App Store App申请审核加速

    有没有遇到上线后发现很严重的bug这种情况,修复bug后提交审核又是漫长的等待,那样会把人逼疯的. 估计是为了对应这样的情况,Apple提供有一个加速审核的通道: https://developer. ...

  5. 动态获取selected的value值

    两个select选项,第一个选项可以选1-9之间的数字,第二个选项可以选0到9之间的数字,要满足成人和儿童的总和不大于9,且一个成人最多带两名儿童 <div> <span>成人 ...

  6. JAVA源码之JDK(一)——java.lang.Object

    想要深入学习JAVA,还需追本溯源,从源码学起.这是我目前的想法.如今JAVA各种开源框架涌出,很多JAVA程序员都只停留在如何熟练使用的层次.身为其中一员的我深感惭愧,所以要加快学习的脚步,开始研究 ...

  7. ETCD使用中需要注意的问题

    我们在实际生产中使用ETCD存储元数据, 起初集群规模不大的时候元数据信息不多没有发现什么问题. 随着集群规模越来越大问题逐渐暴露了 有些实际的配置还是需要在初始化的时候就研究确定 1. --auto ...

  8. Windows如何使用Apache的ab工具进行网站性能测试(Apache服务器自带了ab压力测试工具,可以用来测试网站性能,使用简单方便)

    打开Apache服务器的安装路径,在bin目录中有一个ab.exe的可执行程序,就是我们要介绍的压力测试工具. 在Windows系统的命令行下,进入ab.exe程序所在目录,执行ab.exe程序.注意 ...

  9. 《挑战程序设计竞赛》2.2 贪心法-其它 POJ3617 3069 3253 2393 1017 3040 1862 3262

    POJ3617 Best Cow Line 题意 给定长度为N的字符串S,要构造一个长度为N的字符串T.起初,T是一个空串,随后反复进行下列任意操作: 从S的头部(或尾部)删除一个字符,加到T的尾部 ...

  10. ubuntu su failure when password was right

    https://blog.csdn.net/u013066244/article/details/52694540