理解 Java GC(三)

本文主要讲解下GC的5中类型:

  1. Serial GC (-XX:+UseSerialGC)
  2. Parallel GC (-XX:+UseParallelGC)
  3. Parallel Old GC(-XX:+UseParallelOldGC)
  4. CMS GC (-XX:+UseConcMarkSweepGC)
  5. G1 GC

Serial GC (-XX:+UseSerialGC)

在之前的文章里,我们已经讲解过GC在 young generation采用的GC算法了。GC在 old generation采用的算法是”mark-sweep-compact”。

1、首先标记在“ old generation”存活的对象。(mark)

2、紧接着,从堆的起始位置开始检查,没有用的对象被清理掉,只剩下在1、中标记的存活的对象。(sweep)

3、最后,把所有存活的对象都连续地丢到堆的一端。这时,堆(更准确点是“old generation”)被分成两部分:一部分有对象,另一部分是空闲空间。(compact)

在内存不大,CPU核数不多的情况下采用此类型的GC。

Parallel GC (-XX:+UseParallelGC)

从下面的图中,我们可以很清楚的 区分serial GC和 parallel GC。即serial GC仅用一个线程去执行,而parallel GC用多个线程执行,因此,速度也快了起来。

当内存足够,CPU核数也OK的情况下,这种类型的GC是非常有用的。它也叫作“throughput GC.” (就是可以提高系统的吞吐量)

Parallel Old GC(-XX:+UseParallelOldGC)

Parallel Old GC从JDK5之后出现。通过和上面的parallel GC比较,我们会发现它们的区别仅仅是在处理“ old generation”上。

具体来说,它分为3步:mark-summary-compaction在summary这一步中,从上一步(mark)标记的区域中互不影响地识别出那些存活的对象,这个和“mark-sweep-compac”中“sweep”是不同的,它包含稍微复杂的几步。

CMS GC (-XX:+UseConcMarkSweepGC)

正如上图所示,CMS GC(Concurrent Mark-Sweep GC)比之前提到的任何类型的GC更加复杂。

最初的初始化标记是很简单的一步。离类加载器最近的存活的对象会被搜索到。因此,暂停时间超短。

在并行标记这步中,在上步中已经确认存活的对象所引用的对象将会被跟踪和检查。这两步的区别是上一步“stop-the-world”,而这一步是有用户线程在并行执行。在并行标记步骤中,一直被引用的对象刚刚加入或者停止的都将被检查。

最后,在并行清理步骤中,GC开始回收垃圾。GC线程同样是和其他用户线程并行执行。既然CMS GC以这种方式执行,那它暂停时间短暂也将不足为奇了。所以, CMS GC也称为 “low latency GC”(短等待GC),常被应用在响应时间要求极高的环境下。

说完了CMS GC的优点,接下来我们聊聊它的弊端:

  • 和其他类型GC相比,它占用更多内存和CPU时间;
  • 默认是不提供压缩步骤的。

如果你还有疑问,可返回去比较之前提到的GC类型。压缩工作可以减少内存碎片,但同时耗时也长,特别是在“stop-the-world“。你可以经常检查下压缩工作的耗时。

G1 GC

要理解G1 GC(Garbage First GC),你要抛弃目前你所了解到的关于 young generation 和 the old generation的知识。

正如上图所示 ,一个对象被分配到一个网格中,接着执行GC。一旦一片空间用完,就会开始使用另外一片空间,然后GC开始清理。之前提到的数据在young generation 经过3个空间的转移最后会被丢到the old generation,这种清理方式在G1 GC是看不到的。

G1 GC是用来取代CMS GC的,从长远来看,CMS GC会带来一堆问题。

G1 GC的性能是为人称道的。它比目前我们提到的任何类型的GC更加高速。但在JDK6中,被认为是早期的一种方式,而且只能用来测试。不过在JDK7中,已经被采用了。我自己觉得,在NHN在实际应用中采用JDK7之前,我们是需要大量的测试的。所以你可能要等一段时间。当然,我听说JVM在JDK6中采用了G1 崩溃了几次。所以等它的稳定版吧。(笔者加注:目前JDK 8都已经出来了,作者这篇文章写于12年,不要在意哈)

在后续讲解中,我们谈谈GC调优。先思考下这个问题:

如果应用程序创建的所有对象的大小和类型都确定,可以识别,那公司里采用所有的GC选项都可以一样了。但一个对象的大小和生命周期是依赖于应用的,而且类型也有可能发生改变。换言之,一个应用采用GC选项中的”A”方案,并不意味着可以直接复制到另一个应用上。所以,通过持续的监控和调整,我们才能找到最合适自己应用的方案。

好了,下一篇文章我们开始讲解如何监控GC并调优。

时间: 2024-08-01 22:43:04

理解 Java GC(三)的相关文章

理解 Java GC(一)

引言: 申明:本文翻译自Sangmin Lee的Understanding Java Garbage Collection. 原文链接:http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/ 知道Java中GC的工作原理有啥好处呢?首先,是软件工程师好奇心得到满足:其次,让你写出更加优秀的Java应用.这其实是一个我个人的且主观的想法,但我认为作为一个优秀的Java开发者, 熟练和精通GC是必须

深入理解Java的三种工厂模式

一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 1 public interface Car { 2 String getName(); 3 } 奔驰类 1 public class Benz implements Car { 2 @Override 3 public String getName() { 4 return "Benz"; 5 } 6 } 宝马类 1 public c

Java GC回收机制

优秀Java程序员必须了解的GC工作原理 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率 ,才能提高整个应用程序的性能. 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率 ,才能提高整个应用程序的性能.本篇文章首先简单介绍GC的工

Java GC(垃圾回收)机制知识总结

目录 Java GC系列 Java系列笔记(3) - Java 内存区域和GC机制 面试题:"你能不能谈谈,java GC是在什么时候,对什么东西,做了什么事情?" Java GC系列 本部分来自Java GC系列(1):Java垃圾回收简介 Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序. 下面四篇教程是了解Java 垃圾回收(GC)的基

步步理解 JAVA 泛型编程

步步理解 JAVA 泛型编程 转载自: 隔叶黄莺 Unmi Blog------步步理解 JAVA 泛型编程(一) 隔叶黄莺 Unmi Blog------步步理解 JAVA 泛型编程(二) 隔叶黄莺 Unmi Blog------步步理解 JAVA 泛型编程(三) 步步理解 JAVA 泛型编程(一) JDK 1.5 相对于 JDK 1.4 来说变化最大的部分就是泛型,甚至可以说自 Java 1.0 发布以来也是最大的一次语言变化,因为要涉及到编译器的大改动.很早的时候大家对泛型的呼声很大,正如

【由浅入深理解java集合】(五)——集合 Map

前面已经介绍完了Collection接口下的集合实现类,今天我们来介绍Map接口下的两个重要的集合实现类HashMap,TreeMap.关于Map的一些通用介绍,可以参考第一篇文章.由于Map与List.Set集合的某些特性有重合,因此观看本篇文章的会参考到之前的一些内容,最下方有链接.如果已经有这方面的基础,那么对Map的学习将会事半功倍. HashMap HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. 既然要介绍HashMap,那么就顺带介绍HashTable

[译]GC专家系列1: 理解Java垃圾回收

原文链接:http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/ 了解Java的垃圾回收(GC)原理能给我们带来什么好处?对于软件工程师来说,满足技术好奇心可算是一个,但重要的是理解GC能帮忙我们更好的编写Java应用程序. 上面是我个人的主观的看法,但我相信熟练掌握GC是成为优秀Java程序员的必备技能.如果你对GC执行过程感兴趣,也许你只是有一定的开发应用的经验:如果你仔细考虑过如何选择合适

Java GC专家系列1:理解Java垃圾回收

了解Java的垃圾回收(GC)原理能给我们带来什么好处?对于软件工程师来说,满足技术好奇心可算是一个,但重要的是理解GC能帮忙我们更好的编写Java应用程序. 上面是我个人的主观的看法,但我相信熟练掌握GC是成为优秀Java程序员的必备技能.如果你对GC执行过程感兴趣,也许你只是有一定的开发应用的经验:如果你仔细考虑过如何选择合适的GC算法,说明你对你所开发的程序有了全面的了解.当然这对一个优秀的程序员来说未必是一个通用的标准,但很少人会反对我关于”理解GC是作为优秀Java程序员的必备技能”的

(3) 深入理解Java Class文件格式(三)

转载:http://blog.csdn.net/zhangjg_blog/article/details/21557357 首先, 让我们回顾一下关于class文件格式的之前两篇博客的主要内容. 在 深入理解Java Class文件格式(一) 中, 讲解了class文件在整个java体系结构中的位置和作用, 讲解了class文件中的魔数和版本号相关的信息, 并且对常量池进行了概述. 在 深入理解Java Class文件格式(二) 中, 主要讲解了class文件中的特殊字符串, 包括类的全限定名,