• 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. hashMap与hashTable区别

    1.继承不同. public class Hashtable extends Dictionary implements Map public class HashMap extends Abstra ...

  2. 怎样開始学习ADF和Jdeveroper 11g

    先给一些资料能够帮助刚開始学习的人開始学习ADF和Jdeveloper11g 1.首先毫无疑问,你要懂java语言. 能够看看Thinking In Java, 或者原来sun的网上的一些文档Sun' ...

  3. Linux下文件属性(drwxr-xr-x)详解以及(-rwxrwxrwx=777)(转)

    权限的计算是除去第一位字母开始,权限都是三个符号为一组合,其中-表没有这个权限. drwxr-xr-x的意思解释: ls -al 得到如下列表: drwxr-xr-x 4 oracle dba 409 ...

  4. win7下安装memcached

    memcached server端服务在win7下的安装.启动图解 1.首先下载解压memcached-1.2.6-win32-bin.zip到某一盘下,如下图 2.通过管理员方式运行cmd.exe. ...

  5. 学习-go语言坑之for range

    引用自 http://studygolang.com/articles/9701 go只提供了一种循环方式,即for循环,在使用时可以像c那样使用,也可以通过for range方式遍历容器类型如数组. ...

  6. thrift框架总结,可伸缩的跨语言服务开发框架

    thrift框架总结,可伸缩的跨语言服务开发框架 前言: 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等.其 ...

  7. Nginx的安装与基本应用

    web服务器软件IIS (windows底下的web服务器软件) Nginx (Linux底下新一代高性能的web服务器) Tengine www.taobao.com 这是淘宝 Apache (Li ...

  8. [Algorithms] Counting Sort

    Counting sort is a linear time sorting algorithm. It is used when all the numbers fall in a fixed ra ...

  9. 使用MAP文件快速定位程序崩溃代码行 (转)

    使用MAP文件快速定位程序崩溃代码行 =========================================================== 作者: lzmfeng(http://lz ...

  10. Remoting在多IP多网卡内外网环境下的问题

    Remoting服务器端如果服务器有多块网卡,多个IP地址的情况下会出现客户端callback失败的问题,debug以后发现客户端会callback到服务器端另外一个IP地址(例如外网地址,而不是内网 ...