GC调优简介

来源:互联网 发布:js 数组对象合并 编辑:程序博客网 时间:2024/06/13 23:52

GC 调优简介

GC就是垃圾回收,垃圾回收有三个重要的指标:


  • 吞吐量:衡量垃圾回收器运行在性能峰值的时候不需要关心垃圾回收器暂-停的时间或者需要占用内存的能力。
  • 延迟:衡量垃圾回收器最小化甚至消灭由垃圾回收器引起的暂停时间和应用抖动的能力。
  • 内存占用:衡量为了高效的运行,垃圾回收器需要的内存。

一项指标的提升,往往需要牺牲其他一项或者两项指标。换一句话说,一项指标的妥协通常是为了支持提升其他一项或者两项指标。然而,对于大多数应用来说,很少有3项指标都非常重要,通常,一项或者两项比其他的更重要。
由于始终需要各种权衡,那么知道哪项指标对应用是最有必要的就显得非常重要。

GC原则

在优化JVM垃圾回收器的时候,有3项基本原则
- 在minor垃圾回收器中,最大量的对象被回收,这个被称为Minor GC回收原则。秉承这个原则可以减少由应用产生的full垃圾回收数量和频率,Full垃圾回收往往需要更长的时间,以致于应用无法达到延迟和吞吐量的需求。
- 更多的内存分配给垃圾回收器,也就是说更大的Java堆空间,垃圾回收器和应用在吞吐量和延迟上会表现得更好,这条原则被称为GC最大内存原则
- 优化JVM垃圾回收器的3个指标中的2个,这个被称为2/3 GC优化原则
在进行优化JVM垃圾回收器的时候, 牢牢记住这三条原则会让你的优化任务更容易完成。

GC的分类

针对HotSpot VM的实现,它里面的GC其实准确分类只有两大种:

Partial GC:并不收集整个GC堆的模式

Young GC(Minor GC):只收集young gen的GC
Old GC:只收集old gen的GC。只有CMS的concurrent collection是这个模式
Mixed GC:收集整个young gen以及部分old gen的GC。只有G1有这个模式

Full GC:收集整个堆,包括young gen、old gen、perm gen(如果存在的话)等所有部分的模式。

Major GC通常是跟full GC是等价的,收集整个GC堆。但因为HotSpot VM发展了这么多年,外界对各种名词的解读已经完全混乱了,当有人说“major GC”的时候一定要问清楚他想要指的是上面的full GC还是old gen。

java服务或者web GC调优

参数简介和日志详解

首先大家要先了解,java启动参数,如果不了解可以在看之前的章节-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -
XX:MaxPermSize=256m -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -Xloggc:./gclogs

-Xss —线程堆栈大小,一般用于存放方法入口参数和返回值,以及原子类型的本地变量(即方法内部变量);一般可设置为128k.
-Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆 栈大小为1M,以前每个线程堆栈大小为256K
-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径
-XX:+PrintCommandLineFlags 打印出在HotSpot VM初始化的时候选择的初始值和最大值比如-XX:InitialHeapSize= -XX:MaxHeapSize=,这里n表示初始化的java堆大小值,m表示java堆的最大值。

JDK 1.7 默认启动的时候,新生代采用ParallelGC和老年代采用ParallelOldGC。

2017-08-23T16:38:24.535+0800: 120.419: [GC2017-08-23T16:38:24.535+0800: 120.420: [PSYoungGen: 620234K->62626K(645120K), 0.0543480 secs] 912910K->355303K(2025472K), 0.0551220 secs] [Times: user=0.21 sys=0.00, real=0.05 secs]
详解:【YoungGC发生的时间,PSYoungGen 代表新生代用的是ParallelGC,依次是年轻代垃圾回收前的大小 - 年轻代垃圾回收后的大小(新生代总大小),
回收时间】 堆区垃圾回收前的大小 - 堆区垃圾回收后的大小(堆总大小),回收时间【time :GC用户耗时,系统耗时,实际耗时】
2017-08-23T16:38:24.835+0800: 121.465: [Full GC [PSYoungGen: 1235K->0K(18944K)] [ParOldGen: 27896K->11293K(27136K)] 29131K->11293K(46080K) [PSPermGen: 38241K->38238K(40960K)], 0.3168340 secs] [Times: user=0.77 sys=0.01, real=0.32 secs]
详解:【FullGC比YoungGC,多了老年代和永久区的回收,跟上面大致一样,回收前,回收后,总大小,这里就不在啰嗦。】

jvm一步步优化,详细介绍了,应用堆初始化大小该如何设置,以及在吞吐量,延时,内存占用3个指标中如何取舍
CMS GC详解,请参考这篇文章,写得非常详细

下面的一些jvm的参数,他们的默认值一般比较容易忽略,记录下来,方便查询
-Xms 默认情况下堆内存的64分之一
-Xmx 默认情况下对内存的4分之一
-Xmn 默认情况下堆内存的64分之一
-XX:NewRatio 默认为2
-XX:SurvivorRatio 默认为8

在linux 环境下,可以使用jmap -heap pid 查看某个应用的内存占用情况,结果如下:

using thread-local object allocation.
Parallel GC with 4 thread(s) //GC 方式 Heap Configuration: //堆内存初始化配置
MinHeapFreeRatio=40 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
MaxHeapFreeRatio=70 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
MaxHeapSize=512.0MB //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = 1.0MB //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
MaxNewSize =4095MB //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
OldSize = 4.0MB //对应jvm启动参数-XX:OldSize=:设置JVM堆的‘老生代’的大小
NewRatio = 8 //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
PermSize= 16.0MB //对应jvm启动参数-XX:PermSize=:设置JVM堆的‘永生代’的初始大小
MaxPermSize=64.0MB //对应jvm启动参数-XX:MaxPermSize=:设置JVM堆的‘永生代’的最大大小

      Heap Usage:               //堆内存分步      PS Young Generation      Eden Space:          //Eden区内存分布        capacity = 20381696 (19.4375MB)  //Eden区总容量        used     = 20370032 (19.426376342773438MB)  //Eden区已使用        free     = 11664 (0.0111236572265625MB)  //Eden区剩余容量        99.94277218147106% used  //Eden区使用比率     From Space:        //其中一个Survivor区的内存分布         capacity = 8519680 (8.125MB)         used     = 32768 (0.03125MB)         free     = 8486912 (8.09375MB)         0.38461538461538464% used    To Space:            //另一个Survivor区的内存分布        capacity = 9306112 (8.875MB)        used     = 0 (0.0MB)        free     = 9306112 (8.875MB)        0.0% used    PS Old Generation  //当前的Old区内存分布        capacity = 366280704 (349.3125MB)        used     = 322179848 (307.25464630126953MB)        free     = 44100856 (42.05785369873047MB)        87.95982001825573% used    PS Perm Generation  //当前的 “永生代” 内存分布        capacity = 32243712 (30.75MB)        used     = 28918584 (27.57891082763672MB)        free     = 3325128 (3.1710891723632812MB)        89.68751488662348% used
原创粉丝点击