本随笔是《深入理解Java虚拟机 JVM高级特性与最佳实践》读书笔记。

1.JDK1.7之后的HotSpot虚拟机所包含的所有收集器如下:

解读:

1. 总共有7种垃圾收集器

2.Serial,ParNew,Parallel Scavenge 负责堆年轻代中的内存回收

3.Serial Old,CMS,Parallel Old 负责堆老年代中的内存回收

4.G1分代回收,能独立管理整个GC堆

5.两个收集器中间存在连线的,说明能够配合工作

各个收集器对比

名称

收集算法

工作区域

可配合对象

线程

并发

适用场合

优缺点

Serial

复制算法

新生代

CMS;

Serial Old

单CPU;

Client模式下

缺:stop the world;

优:简单高效,没有线程交互开销,专注于GC;

ParNew

复制算法

新生代

CMS;

Serial Old

多CPU;

Server模式下

缺:stop the world

优:并行并发GC

Parallel Scavenge

复制算法

新生代

Serial Old;

Parallel

Scavenge

吞吐量控制,Client,server均可以

主要关注吞吐量,通过吞吐量的设置控制停顿时间,适应不同的场景

Serial Old

标记整理算法

老年代

Serial,ParNew,Parallel  Scavenge

主要Client模式下

缺:stop the world

Parallel Old

复制算法(Parallel Scavenge老年代版本)

老年代

Parallel Scavenge

吞吐量控制,Client,server均可以

主要关注吞吐量,通过吞吐量的设置控制停顿时间,适应不同的场景

CMS(Concurretn Mark Sweep)

标记清除算法

老年代

Serial,ParNew,

Serial Old是其备选方案

互联网站;B/S系统服务端

缺:CPU资源敏感,无法处理浮动垃圾,产生大量内存碎片

优:并发收集,低停顿

G1

整体基于标记整理算法

新生代&老年代

面向服务端应用

优:并行与并发,

分代收集,空间整合(标记整理算法),可预测停顿

名词解释

并行(Parallel):只多条垃圾收集线程并行工作,但此时用户线程处于等待状态,也就是stop the world.

并发(Concurrent):只用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU.

Garbage First收集器

现最流行的是G1(Garbage First)收集器,也是当今收集器技术发展的最前沿成果之一,现重点学习一下。

1.优点

  • 并行与并发;
  • 分代收集;虽然G1可以不需要其他收集器配合而独立管理整个GC堆,但是它能够采用不同的收集算法去处理新创建的对象和已经存活一段时间,熬过多次GC的对象。
  • 空间整合;G1整体是基于标记-整理算法。所以运行期间不会产生内存碎片,收集后能提供规整的可用内存。在分配打对象时不会因为无法找到连续内存而触发下一次GC。
  • 可预测的停顿;G1除了追求低停顿以外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不超过N毫秒。

2.特点

  • 对堆的划分;G1之前的收集器对内存的收集都是新生代或者老年代,而G1不在这样。使用G1收集器时,Java堆的内存布局就和其他收集器有很大区别,他将整个堆划分成多个大小想等的区域(Region).虽然还有概念上的新生代和年老代,但他们之间已经不在物理隔离了,他们都是一部分Region(不需要连续的)的集合。
  • 回收等级;G1能实现可预测的停顿是因为它可以避免对堆中进行全区域的垃圾收集。G1跟踪各个Region里面的垃圾的价值(回收的内存大小和时间的比值)大小,在后台维护一个优先列表,每次优先回收价值最大的Region,这也是可预测停顿的实现的原理。

3.需要思考的问题

 G1把内存化整为零,将整个堆划分为多个Region。那么垃圾收集真的就是以Region为单位进行的吗?听起来顺理成章,仔细想想其实不是,Region不可能是孤立的。一个对象分配在某个Region中,但它并不是只能被本Region中的其他对象引用,而是可以为整个堆中的任意其他对象引用。那么在利用可达性分析判断对象是否存活时,岂不是要扫描整个Java堆才能保证准确性?此类问题在其他收集器中也会出现,新生代年老代同样面临此类问题。

  此类问题的JVM采用Remembered Set来避免全堆扫描。(包括新生代年老代的解决思路)。Remembered  Set工作机制,详见 《深入理解Java虚拟机 JVM高级特性与最佳实践》第三章3.5.7

4.运作步骤

  • 初始标记;
  • 并发标记
  • 最终标记
  • 筛选回收

JVM各垃圾收集器对比的更多相关文章

  1. 【转载】JVM 学习——垃圾收集器与内存分配策略

    本文主要是对<深入理解java虚拟机 第二版>第三章部分做的总结,文章中大部分内容都来自这章内容,也是博客 JVM 学习的第二部分. 简述 说到垃圾收集(Garbage Collectio ...

  2. 深入理解JVM : Java垃圾收集器

    如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商.不同版本的虚拟机所提供的垃圾收集器都可能会有很大差 ...

  3. JVM之垃圾收集器

    前一篇讲了垃圾收集算法--JVM之GC算法.垃圾收集算法——标记-清除算法.复制算法.标记-整理算法.分代收集算法,如果把它看作是方法论,那么下面说的就应该是内存回收的具体实现. 先看一下JVM中有哪 ...

  4. JVM、垃圾收集器

    1.Java虚拟机原理 所谓虚拟机,就是一台虚拟的机器.他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机, 大名鼎鼎的Vmare就属于系统虚拟机,他完全是对物理计算 ...

  5. JVM之垃圾收集器与内存分配回收策略(二)

    上一篇JVM垃圾收集器与内存分配策略(一),下面是jdk1.7版本的垃圾收集器之间的关系,其中连线两端的两种垃圾收集器可以进行搭配使用,下面来总结一下这些收集器的一些特点以及关系. 一.Serial收 ...

  6. jvm:垃圾收集器

    垃圾收集器: Serial 收集器: 单线程收集器,专注做收集,会暂停别的工作.收集效果好. ParNew 收集器: 是Serial的多线程版本.目前只有它能和CMS收集器配合.    Paralle ...

  7. 理解JVM之垃圾收集器详解

    前言 垃圾收集器作为内存回收的具体表现,Java虚拟机规范并未对垃圾收集器的实现做规定,因而不同版本的虚拟机有很大区别,因而我们在这里主要讨论基于Sun HotSpot虚拟机1.6版本Update22 ...

  8. 理解JVM之垃圾收集器概述

    前言 很多人将垃圾收集(Garbage Collection)视为Java的伴生产物,实际1960年诞生的Lisp是第一门真正使用内存动态分配与垃圾手机技术的语言.在目前看来,内存的动态分配与内存回收 ...

  9. JVM学习十:JVM之垃圾收集器及GC参数

    接近两个月左右没有写博客,主要是因为小孩过来后,回家比较忙,现在小孩端午送回家了,开始继续之前的JVM学习之路,前面学习了GC的算法和种类,那么本章则是基于算法来产生实际的用途,即垃圾收集器. 一.堆 ...

随机推荐

  1. 基于asp.net mvc的近乎产品开发培训课程(第二讲)

    演示产品源码下载地址:http://www.jinhusns.com/Products/Download 

  2. c#数据库设计--1、概述

    一.数据库设计的概念 数据库设计是将数据库中的数据实体及这些数据实体之间的关系,进行规划和结构化的过程. 二.数据库设计的重要性 设计决定代码量,一将不行,累死三军. 如果一个数据库没有进行一个良好的 ...

  3. 链接正常但IE浏览器无法显示网页的几种情况

    一.感染病毒木马所致 这种情况往往表现在打开IE时,在IE界面的左下框里提示:正在打开网页,但一直无响应. 右击任务栏/任务管理器/进程,查看.如果CPU占用率100%,可以断定是感染了病毒,这时要查 ...

  4. windows中80端口被System占用,PID=4的问题

    在windows中如果tomcat需要使用80端口,发现该端口已经被占用,而netstat -ano发现该80端口被一个System的进程占用了,而PID=4.我们可以通过下面的方式找到对应的进程,然 ...

  5. mybatis将传入0识别成空字符串

    mybatis将传入的Integer类型的0被识别成空字符串,网上的解决办法: <if test="status != null and status != '' or status ...

  6. git push报错error: failed to push some refs to 'git@github.com'

    git push报错error: failed to push some refs to 'git@github.com' $ git push -u origin master To git@git ...

  7. 自定义适用于手机和平板电脑的 Dynamics 365(二):窗体自定义项

    适用于手机的 Dynamics 365 和 适用于平板电脑的 Dynamics 365 使用窗体作为 Web 应用. 窗体在应用程序中的显示方式为移动体验进行了优化. 下图显示了从 Web 应用程序到 ...

  8. ActiveReports 报表应用教程 (11)---交互式报表之文档目录

    通过文档目录,用户可以非常清晰的查看报表数据结构,并能方便地跳转到指定的章节,最终还可以将报表导出为PDF等格式的文件.本文以2012年各月产品销售分类汇总报表为例,演示如何在葡萄城ActiveRep ...

  9. ionic开发之Android的focus起作用,而iOS不起作用

    基于ionic的iOS的hybird APP无法使用focus获取焦点和键盘的问题. 解决办法就是: 原本APP的配置文件config.xml里面默认有一句 这句话的大概意思就是键盘的显示需要用户去触 ...

  10. Python笔记(四):异常处理机制与 open()

    (一)  异常处理机制概述 就像日常生活中会遇到各种意外情况一样(例如:你可能考虑过如果中了500w该怎么做),代码运行过程中也会遇到这种意外情况,python提供了这么一种机制,处理意外情况(就像如 ...