Java GC 垃圾回收器的类型小结

阅读了java paper的垃圾回收器类型文章,在此做一个小结,文章部分翻译自java paper gc collector,部分自己做的总结,图片来自网络,在此仅用作理解表达之用。

一、JVM GC 垃圾回收器类型

JVM的垃圾回收器大致分为四种类型:

(图片来自网络)

1、串行垃圾回收器  Serial Garbage Collector

串行垃圾回收器在进行垃圾回收时,它会持有所有应用程序的线程,冻结所有应用程序线程,使用单个垃圾回收线程来进行垃圾回收工作。

串行垃圾回收器是为单线程环境而设计的,如果你的程序不需要多线程,启动串行垃圾回收。(一般是command line程序)

使用方法:-XX:+UseSerialGC

Ps:在jdk client模式,不指定VM参数,默认是串行垃圾回收器

(图片来自网络)

2、并行垃圾回收器  Parallel Garbage Collector

并行垃圾回收器在进行垃圾回收时,同样会持有所有应用程序的线程,并冻结所有应用程序线程,来进行垃圾回收工作。

唯一和串行垃圾回收器不同的是,并行垃圾回收器是使用多线程来进行垃圾回收工作的。

jdk client模式下使用串行垃圾回收器。

(图片来自网络)

3、并发标记扫描垃圾回收器 CMS Garbage Collector

Concurrent Mark Sweep (CMS)垃圾回收器使用并发标记算法,使用多线程来扫描heap memory来标记实例,然后清理被标记过的实例。

CMS垃圾回收器有时候会Hold所有的应用程序线程,但有时候只会Hold部分应用程序线程。

什么时候会暂停所有应用程序线程?

1、在老年代中,当标记被引用的对象时

2、如果正在垃圾回收时,并行的改变在heap memory发生了。

相比前两个垃圾回收器来说,CMS一定程度上缩短了应用程序GC时暂停的时间。

相比并行垃圾回收,CMS收集器使用更多的CPU来换取更多的应用程序吞吐量。

但是CMS进行恢复内存后的内存空间压缩整理时,会Stop the world。

如果能分配更多的CPU给垃圾回收器,那么CMS会是一个比并行垃圾回收更好的选择。

XX:+USeParNewGC

(图片来自网络)

4、G1垃圾回收器  G1 Garbage Collector

G1垃圾回收器是用在heap memory很大的情况下,把heap划分为很多很多的region块,然后并行的对其进行垃圾回收。

G1垃圾回收器在清除实例所占用的内存空间后,还会做内存压缩。

G1垃圾回收器回收region的时候基本不会STW,而是基于 most garbage优先回收 的策略来对region进行垃圾回收的。

–XX:+UseG1GC

java8中,使用-XX:+UseStringDeduplication

This optimizes the heap memory by removing duplicate String values to a single char[] array

这个优化会优化冗余的string为一个char数组。

(图片来自网络)

二、四种垃圾回收器的选用决定因素:

1、应用程序的场景

2、硬件的制约

3、吞吐量的需求

串行垃圾回收是最简单的也是效率最低的,如果只是控制台的单线程程序,简单任务,并且机器配置不高,推荐使用。

并行垃圾回收器是64bit server默认的垃圾回收器,一般我们工作和生产上默认不配置,都是并行垃圾回收。对于一般的不要求吞吐的应用,并且硬件资源不是太充足的情况下,并行垃圾回收器差不多能满足需求。

CMS垃圾回收器是对并行垃圾回收器的一个优化,它以CPU和系统资源为代价,换取GC的延迟。不会一GC就STW,而是根据情况STW。一定程度上是资源换取速度。

G1垃圾回收器是针对于大heap的垃圾回收器,如果heap分配的足够大,分的region的优先级回收策略会优先清理垃圾多的region.并且减少了内存空间碎片,分配大对象时不会因为无法找到连续内存空间而提前触发下一次GC。

三、配置

Option Description
-XX:+UseSerialGC Serial Garbage Collector 串行垃圾回收器
-XX:+UseParallelGC Parallel Garbage Collector并行垃圾回收器
-XX:+UseConcMarkSweepGC CMS Garbage Collector并发标记垃圾回收器
-XX:ParallelCMSThreads= CMS Collector – number of threads to use 并发标记垃圾回收器使用的线程数,通常是cpu个数
-XX:+UseG1GC G1 Gargbage Collector 使用G1垃圾回收器

GC Optimization Options

Option Description
-Xms Initial heap memory size 初始化heap大小 -Xms512M
-Xmx Maximum heap memory size 设置最大的heap大小
-Xmn Size of Young Generation 年轻代的大小
-XX:PermSize Initial Permanent Generation size 初始化永久带的大小
-XX:MaxPermSize Maximum Permanent Generation size 最大的永久带大小

Parallel GC 并行垃圾回收策略举例:

java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20-XX:+UseParallelOldGC MaxGCPauseMillis=100-XX:MaxGCPauseMillis=100

CMS GC 并发标记清楚垃圾回收策略举例:

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k-XX:ParallelGCThreads=20 
-XX:+UseConcMarkSweepGC-XX:+UseParNewGC -XX:CMSFullGCsBeforeCompaction=5-XX:+UseCMSCompactAtFullCollection

Eg:

java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar

更多详细配置,请参考:http://blog.sina.com.cn/s/blog_4080505a0101i6cr.html

四、查看垃圾回收器

我们知道jvm分client 和 server模式。

如果启动jvm不指定模式,jdk会根据当前的操作系统配置来启动不同模式的jvm。

默认64bit操作系统下都会是server模式的jvm。

java -XX: +PrintCommandLineFlags -version
-XX:MaxHeapSize=1073741824 -XX:ParallelGCThreads=85
-XX: +PrintCommandLineFlags -XX: +UseParallelGC
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b07)
Java HotSpot(TM) Server VM (build 14.0-b15, mixed mode)

For J2SE 5.0, the definition of a server-class machine is one with at least 2 CPUs and at least 2GB of physical memory.

对于jdk5,区分是否是server还是client jvm模式,至少2个CPU和2GB的物理内存。


Platform

Default VM
Architecture OS
client VM

if server-class, server VM;

otherwise, client VM


server VM
SPARC 32-bit Solaris
 

X

 
i586 Solaris
 

X

 
Linux
 

X

 
Microsoft Windows
X

 

 
SPARC 64-bit Solaris

 

X
AMD64 Linux

 

X
Microsoft Windows

 

X

Legend:   X = default VM      — = client VM not provided for this platform

五、总结:

垃圾回收器目前分为四种类型, 串行,并行,并发标记,G1。

小数据量和小型应用,使用串行垃圾回收器即可。

对于对响应时间无特殊要求的,可以使用并行垃圾回收器和并发标记垃圾回收器。(中大型应用)

对于heap可以分配很大的中大型应用,使用G1垃圾回收器比较好,进一步优化和减少了GC暂停时间。

没有银弹,针对不同的场景,选用不同的垃圾回收器。

参考文献:

http://javapapers.com/java/types-of-java-garbage-collectors/

http://blog.sina.com.cn/s/blog_4080505a0101i6cr.html

http://www.techpaste.com/2012/02/20/default-jvm-settings-gc-jit-java-heap-sizes-xms-xmx-operating-systems/#more-3569

http://docs.oracle.com/javase/1.5.0/docs/guide/vm/server-class.html

原创文章,转载请注明出自:http://blog.csdn.net/oopsoom/article/details/40374897

时间: 2024-12-17 16:12:39

Java GC 垃圾回收器的类型小结的相关文章

[Java基础]-- Java GC 垃圾回收器的分类和优缺点

https://blog.csdn.net/high2011/article/details/80177473?utm_source=blogxgwz2 所属专栏: Java 版权声明:尊重原创,转载请标明,本文转自 https://blog.csdn.net/high2011/article/details/80177473 关于Java的垃圾回收器,一直是个头疼的问题,这里简要说明下分类和优缺点,供选择使用. 一.JVM GC 垃圾回收器类型 JVM的垃圾回收器大致分为六种类型: 1.串行:

Android内存优化1 了解java GC 垃圾回收机制3

引言 接App优化之内存优化(序), 作为App优化系列中内存优化的一个小部分. 由于内存相关知识比较生涩, 内存优化中使用到的相关工具, 也有很多专有名词. 对Java内存管理, GC, Android内存管理, Dalvik/ART等知识有一个理论的认识, 可以让我们更好的使用这些工具, 分析内存问题. 据此, 我们就先从理论入手, 聊聊GC那些事儿. 1, 何为GC GC 是 garbage collection 的缩写, 垃圾回收的意思. 也可以是 Garbage Collector,

一篇文章让你了解GC垃圾回收器

简单了解GC垃圾回收器 了解GC之前我们首先要了解GC是要做什么的?顾名思义回收垃圾,什么是垃圾呢? GC回收的垃圾主要指的是回收堆内存中的垃圾对象. 从根对象出发,所有被引用的对象,都是存活对象 其他对象,都是垃圾对象. 根对象:  栈中的引用变量,所引用的对象. 方法区经静态变量所引用的对象. GC回收的三种基本方式 一.标记-清除 标记存活对象,清理其他垃圾对象(阴影为存活对象,空白为垃圾对象) 优点:效率高 缺点:产生碎片,使内存分布碎片化,造成内存空间不连续.若出现大的对象,内存空间不

面试官,不要再问我“Java GC垃圾回收机制”了

Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底层原理,图文并茂,突破学习及面试瓶颈. 楔子-JVM内存结构补充 在上篇<JVM之内存结构详解>中有些内容我们没有讲,本篇结合垃圾回收机制来一起学习.还记得JVM中堆的结构图吗? 图中展示了堆中三个区域:Eden.From Survivor.To Survivor.从图中可以也可以看到它们的大小比例,准确来说是:8:1:1.为什么要这样设计呢,本篇文章后续会给出解答,还是根据垃圾回收的具体情况来设计的.

第5章(2) Java的垃圾回收器

终结处理 Java有垃圾回收器回收无用对象占据的内存资源.但垃圾回收器只知道释放经由new分配的内存,如果用其他的方法获得了一块"特殊"的内存区域,就需要我们自己完成清理工作.Java提供了finalize()方法来解决这一问题. finalize()方法: 工作原理:一但垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存. 其作用,换句话说就是:在你不再需要某个对象之前,如果必须执行某些动作,那么你

Java GC - 垃圾回收机制

1.简介 对于Java developer来说,了解JVM GC工作原理能够帮助我们开发出更优秀的应用,同时在处理JVM瓶颈时能够更加自由.在最近一年的应用开发中能体会到这些知识带来的好处,并且让我们的应用在较大规模的并发时能够良好的工作. 本文部分知识和图片来源于书籍<Java Performance> - Charlie Hunt & Binu John 著,该书全面讲解了Java 应用的性能分析.优化点与JVM原理等知识,本文(以及稍候的一些文章)只包含 GC collector

数往知来C#之接口 值类型与引用类型 静态非静态 异常处理 GC垃圾回收 值类型引用类型内存分配&lt;四&gt;

C# 基础接口篇 一.多态复习 使用个new来实现,使用virtual与override    -->new隐藏父类方法 根据当前类型,电泳对应的方法(成员)    -->override重写 无论什么情况,都是执行新的方法(成员) 继承是实现多态的一个前提,没有继承多态是不能实现的 父类与子类实现多态 抽象类与子类实现 抽象类不能实例化 抽象类中的抽象方法没有方法体 抽象类的成员有哪些   ->包含非抽象成员   ->不能实例化   ->子类必须实现父类的 抽象方法,除非子

java GC垃圾回收机制G1、CMS

CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间.对于要求服务器响应速度的应用上,这种垃圾回收器非常适合.在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS.CMS采用的基础算法是:标记—清除. 使用场景: 1.应用程序对停顿比较敏感,并且在应用程序运行的时候可以提供更大的内存和更多的CPU 2.在JVM中,有相对较多存活时间较长的对象(老年代比较大)会更适合使用CMS. 为解决CMS算法产生

[JVM 相关] Java 新型垃圾回收器(Garbage First,G1)

回顾传统垃圾回收器 HotSpot 垃圾收集器实现 Serial Collector(串型收集器) 使用场景,大多数服务器是单核CPU. 适用收集场景:1. 新生代收集(Young Generation Collection)2. 老年代收集(Old Generation Collection) Parallel Conllector(并行收集器) 又叫吞吐量收集器(throughput collector)应用于多核系统. 适用收集场景:1. 新生代收集是并行处理.2. 老年代收集和Seria