JVM GC调优入门

JVM GC调优入门

这篇文章会介绍几个常用的调优参数,再通过两个案例介绍如何进行JVM GC调优。阅读这篇文章的前提是假设大家已经对JVM内存模型、JVM的垃圾回收算法、JVM的垃圾回收器都比较熟悉了。

JVM调优是必须的吗?

阅读下面的内容之前首先抛出这个问题:GC调优对于java服务是必须的吗?实际上,我感觉80%的java的程序员在实际工作中都没有碰到过GC调优吧,这是因为多数的Java应用不需要在服务器上进行GC优化,多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题,需要记住一点:GC调优是最后要做的工作

GC调优的目的可以总结为下面两点:

  • 减少对象晋升到老年代的数量
  • 减少FullGC的执行时间

减少对象晋升到老年代的数量

分代垃圾回收是Oracle JVM中回收思想。 我们知道在Eden区创建的对象,在from Survivor 复制到to Survivor区之后,达到一定年龄就进入了老年代。有些对象因为比较大就直接进入了老年代。在老年代的GC时间相比于年轻代时间更长。因此,减少对象进入老年代可以降低Full GC的频率

减少FullGC的执行时间

Full GC的时间比Minor GC要长。所以如果执行太长时间的Full GC(超过1秒),就会发生超时错误

  • 如果你试着减少老年代的大小来降低Full GC的执行时间,可能会引发OutOfMemoryError或者导致Full GC的频率升高。
  • 如果是通过增加老年代的大小来降低Full GC的频率,执行时间将会增加。

影响GC的参数

JVM调优主要用到参数罗列在下面的两张表中。主要分为内存参数和垃圾类型参数。GC优化的过程就是在调试这些参数的过程。

下表是与JVM内存相关的参数:


image.png

比较常用的参数是 -Xms, -Xmx-XX:NewRatio

下表展示的垃圾收集器类型的可选参数:


image.png

不同的垃圾回收器与老年代年轻代的关系如下:


image.png

还有一个常用的参数是-XX:+PrintGCDetails
通过 -XX:+PrintGCDetails可以查看具体的GC日志。下面的两张图分别介绍Full GC与Minor GC日志里的各个字段。

image.png

image.png

监控命令

设置好上面将的参数后,可以通过监控查看我们优化的。监控可以分为命令监控图形化监控。关于图形化监控可用工具比较常见的有JConsole和VisualVM,可以参考这篇文章。这里不做过多介绍。这节主要介绍个常用的监控命令,在下面的案例中也是有用到的。

jps 命令格式:jps [option] [hostid]
jps命令用于查询正在运行的JVM进程,常用的参数为:
-q:只输出LVMID,省略主类的名称
-m:输出虚拟机进程启动时传给主类main()函数的参数
-l:输出主类的全类名,如果进程执行的是Jar包,输出Jar路径
-v:输出虚拟机进程启动时JVM参数

例子:


image.png

jstack 命令格式:jstack [option] vmid
用于生成当前JVM的所有线程快照,线程快照是虚拟机每一条线程正在执行的方法,目的是定位线程出现长时间停顿的原因。
-F:当正常输出的请求不被响应时,强制输出线程堆栈
-l:除堆栈外,显示关于锁的附加信息
-m:如果调用到本地方法的话,可以显示C/C++的堆栈

例子


image.png

jmap 命令格式:jmap [option] vmid
用于显示当前Java堆和永久代的详细信息(如当前使用的收集器,当前的空间使用率等)
-dump:生成java堆转储快照
-heap:显示java堆详细信息(只在Linux/Solaris下有效)
-F:当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照(只在Linux/Solaris下有效)
-histo:显示堆中对象统计信息

例子


image.png

jstat命令格式:jstat [option vmid [interval[s|ms] [count]]]
jstat可以实时显示本地或远程JVM进程中类装载、内存、垃圾收集、JIT编译等数据
-class:监视类装载、卸载数量、总空间及类装载所耗费的时间
-gc:监听Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量,以用空间、GC时间合计等信息
-gccapacity:监视内容与-gc基本相同,但输出主要关注java堆各个区域使用到的最大和最小空间
-gcutil:监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause:与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因
-gcnew:监视新生代GC状况
-gcnewcapacity:监视内同与-gcnew基本相同,输出主要关注使用到的最大和最小空间
-gcold:监视老年代GC情况
-gcoldcapacity:监视内同与-gcold基本相同,输出主要关注使用到的最大和最小空间
-gcpermcapacity:输出永久代使用到最大和最小空间
-compiler:输出JIT编译器编译过的方法、耗时等信息

例子


image.png

命令jstat -gc 309 1000 5代表着:搜集vid为309的java进程的整体gc状态, 每1000ms收集一次,共收集5次

案例

下面两个案例是网友的JVM调优过程,作者过程思路清晰,步步分析到位,在这里分享给大家:
1、CMS调优
2、OOM问题调优

总结

JVM调优在实际工作中用到的比较少,但是这也是作为java程序员必须掌握的基本技能。真正熟练的使用GC调优,是建立在多次进行GC监控和调优的实战经验上的

下面罗列了几个数据作为参考,如果GC执行时间满足下列所有条件,就没有必要进行GC优化了:

Minor GC执行非常迅速(50ms以内)

Minor GC没有频繁执行(大约10s执行一次)

Full GC执行非常迅速(1s以内)

Full GC没有频繁执行(大约10min执行一次)


PS:如果你要应付面试上的JVM题目。这可以参考这篇文章jvm知识点总览

参考文章:How to Tune Java Garbage Collection

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容