JVM GC知识总结

JVM server模式和client模式:JVM如果不指定-server-client选项,JVM会在启动的时候根据硬件环境判断以server模式启动还是以client模式启动(适用于Java 5及以上版本)。

JVM工作在server模式可以大大提高性能,但应用的启动会比client模式慢大概10%。当该参数不指定时,虚拟机启动检测主机是否为服务器,如果是,则以server模式启动,否则以client模式启动,Java 5检测的根据是至少2CPU和最低2GB内存。

JVM用于启动GUI界面的交互应用时适合于使用client模式,当JVM用于运行服务器后台程序时建议用server模式。

JVM  堆内存:Java堆由Perm区和Heap区组成,Heap区由Old区和New区(也叫Young区)组成,New区由Eden区、From区和To区(Survivor)组成,可以参考图3

Eden区用于存放新生成的对象。Eden中的对象生命不会超过一次Minor GC

New区的几种Collector

1、  串行GCSerial Copying

client模式下的默认GC方式,也可使用-XX:+UseSerialGC指定。

2、  并行回收GCParallel Scavenge
server
模式下的默认GC方式,也可用-XX:+UseParallelGC强制指定。

采用PS时,默认情况下JVM会在运行时动态调整Eden:S0:S1的比例,如果不希望自动调整可以使用-XX:-UseAdaptiveSizePolicy参数,内存分配和回收的算法和串行相同,唯一不同仅在于回收时为多线程。

3、  并行GCParNew

CMS GC时默认采用,也可以采用-XX:+UseParNewGC指定。

内存分配、回收和PS相同,不同的仅在于会收拾会配合CMS做些处理。

Old区的几种Collector

1、  串行GCSerial MSC

client模式下的默认GC方式,可通过-XX:+UseSerialGC强制指定。每次进行全部回收,进行Compact非常耗费时间。

2、  并行GCParallel MSC

server模式下的默认GC方式,也可用-XX:+UseParallelGC=强制指定。可以在选项后加等号来制定并行的线程数。

3、  并发GCCMS线上环境采用的GC方式,也就是Realese环境的方式

使用CMS是为了减少GC执行时的停顿时间,垃圾回收线程和应用线程同时执行,可以使用-XX:+UseConcMarkSweepGC=指定使用,后边接等号指定并发线程数。CMS每次回收只停顿很短的时间,分别在开始的时候(Initial Marking),和中间(Final Marking)的时候,第二次时间略长。具体CMS的过程可以参考相关文档。JStat中将Initial MarkRemark都统计成了FGC

CMS一个比较大的问题是碎片和浮动垃圾问题(Floating Gabage)。碎片是由于CMS默认不对内存进行Compact所致,可以通过-XX:+UseCMSCompactAtFullCollection

总体来讲,Old区的大小较大,垃圾回收算法较费时间,导致较长时间的应用线程停止工作,而且需要进行Compact,所以不应该出现较多Major GCMajor GC的时间常常是Minor GC的几十倍。JVM内存调优的重点,减少Major GC 的次数,因为为Major GC 会暂停程序比较长的时间,如果Major GC 的次数比较多,意味着应用程序的JVM内存参数需要进行调整。

此处可以结合后边的Major GC部分理解。

 

JVM GC知识总结

1

 

Minor GC也称为YGCYoung Generation Collection)针对于New区进行的垃圾回收。当New区满了的时候,进行YGC。默认情况下Full GC会触发Minor GC,在PS GC时可通过设置-XX:-ScavengeBeforeFullGC来禁止触发Minor GC

 

Major GC有的时候就是指Full Collectionhttp://www.ibm.com/developerworks/java/library/j-jtp11253/中说:A major collection will collect both the young and old generation. 这篇文章是针对JDK1.4的)。Full Collection的时候所有的内存区都进行垃圾回收,耗费的时间比较长。系统在垃圾回收时会有明显的暂停,而且暂停时间会因为堆越大而越长。正常情况不应该出现大量的FGC。一般,GC首先使用New区特有的回收算法对New区进行回收,也就是YGC。然后,GC使用Old区的回收算法对Old区和Perm区进行回收。如果需要进行Compact,各个区分开进行压缩。

有的时候,FGC并非这样。比如,YGC后有部分对象需要放入Survivor区,但是Survivor区不够大,这些对象就要直接放入Old区,这时由于之前已经执行了一次YGC,所以此次不进行YGC,而是直接使用Old区的回收算法对整个Heap进行Major GC。但是如果使用的是CMS Collector,则必须要执行YGC,因为CMS无法回收New区。

CMS使用独立的GC线程与应用线程并发执行,目的是在Old区满之前完成内存的回收。正常的情况下,CMS能够在不影响应用线程的情况下完成工作。所以进行GC的时候,应用线程几乎不会停止工作。但是,如果CMS不能够在Old区变满之前完成自己的工作,这个时候JVM会将所有的应用线程停止以完成垃圾回收(此种情况为Concurrent Mode Failure,发生FGC还有另外一种情况:Promotion Failed)。Promotion Failed一种情况发生在Old区存在大量碎片的情况下,Old区无法容纳下New区转移过来的对象,此时Old区可能并没有满;另外一种情况发生在Old区快满了,无法容纳新对象。在所有应用线程停止时进行的GC被称为FGC

从图1中可以看出,FGC collector只能为串行GC或并行GC而不能为CMS

OldGC的机制为:GC首先会将Old区分块,然后针对每个块中的内存标记为使用和未使用两种状态。GC将使用率比较高的内存在Compact的时候忽略,而只关注那些使用率比较低的内存。标记后,GC将进行Compact操作,也就是碎片整理,如图2

 

JVM GC知识总结

2

 

 

New区到Old区的Promotion主要有三种情况:

一、在经历了多次的Minor GC后仍然存活

在触发了Minor GC后,存活对象被存入Survivor区在经历了多次Minor GC之后,如果仍然存活的话,则该对象被晋升到Old区。

FromTo作用是相同的。每次Minor GC发生的时候,未被回收的对象从FromCopyTo或者从ToCopyFrom。图3为一次Minor GC发生后的样子。当第二次Minor GC发生的时候,From被清空,From中的存活对象被复制进To区。

之所以要这样做的原因是:

1、  为了整理内存,如图4所示。如果不进行内存整理的话,Survivor区也会存在碎片问题。

2、  再有就是基于这样一个假设:“大部分对象都是短命的”。理想情况是,在有限的几次Minor GC后所有的资源都会被回收。

 

 

JVM GC知识总结

3

 

JVM GC知识总结

4

二、Minor GCSurvivor空间不足就直接放入Old

三、大对象、大数组,直接在Old区中分配

具体多大的对象由-XX:PretenureSizeThreshold=来设置此参数在PS GC时无效,PS GC会动态计算这个参数。

 

如果想看GC的确切情况最好不用JStat而是加上如下JVM参数-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:./gc.log

如下,这里可以看到因为Concurrent Mode Failure引起的FGC,这也说明了Full CollectionCMS的不同

344700.914: [Full GC 344700.915: [CMS (concurrent mode failure):
3103167K->3103167K(3103168K), 20.3730500 secs] 3145663K-
>3108336K(3145664K), [CMS Perm : 140469K->140454K(236664K)],
20.3734200 secs]
344721.314: [GC [1 CMS-initial-mark: 3103167K(3103168K)]
3108391K(3145664K), 0.0361640 secs]
344721.350: [CMS-concurrent-mark-start]

 

 

参考文档:

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html#0.0.0.%20The%20Concurrent%20Low%20Pause%20Collector%7Coutline --- Tuning Garbage Collection with the 5.0 Java Virtual Machine

2、《JVM调优总结》

3https://java.sun.com/j2se/reference/...whitepaper.pdf

4http://blogs.sun.com/jonthecollector/entry/when_the_sum_of_the

5http://blogs.sun.com/jonthecollector/entry/what_the_heck_s_a

6Sun Hotspot 1.6 JVM GCGarbage Collectorhttp://bluedavy.com

原文链接:http://drizzlewalk.blog.51cto.com/2203401/461468

你可能感兴趣的:(jvm)