讲下 jvm 调优思路?

其实工作中,很少有机会能接触到 jvm 调优,大部分时间都是在写 CRUD 代码,但如果万一线上真的出问题了,那么再去想 jvm 调优就有点晚了,所以我们需要先把这部分知识储备起来。

面试官思路:主要是想看下你对造成 JVM 性能问题有没有思考总结过。

可以从三个方面说:
1. 工作中引起 JVM 性能问题的原因到底是代码问题还是 JVM 参数问题?
2. JVM 性能问题如何监控和排查?
3. 如何根据性能问题进行参数调优?

代码排查

首先第一个方面,其实大部分 JVM 性能问题,并不是我们设置的参数问题,一般情况下,都是用默认参数就搞定了,而真正出问题的情况多是自己写的代码有问题,如频繁创建大对象,然后又引用它们不释放,然后这些大对象进入了老年代后,垃圾收集器有回收不了它们,老年代内存不足,造成频繁 Full GC,每次 Full GC 都会触发 STW,也就是造成卡顿现象,这样性能不就很差了吗?

如何监控

这个就是为了记录日志用的,我们可以利用日志来快速定位性能问题。

记录日志就是这个命令了:

-XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:gc.log

然后还可以设置内存溢出后自动导出Dump文件:

-XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\jvm.dump

另外如果想立即导出 dump 文件,用这个命令就可以了:

jmap -dump:format=b,file=D:/demo.hprof pid

当然,我们最好是能把 dump 文件获取到,然后放到本地的工具中分析就好办了。

如何分析 dump 文件

第二个方面中,拿到 dunp 文件后,就是分析:

说到常用的分析工具,当然是少不了 jvisualvm 可视化工具了,可以通过输入命令 jvisualvm 打开,然后载入之前的 dump 文件就可以了。这个工具会显示现在有哪些大对象占用着内存在。另外也可以通过 JProfiler 可视化工具来排查。

整体思路就是拿到 dump 文件,放到可视化工具中分析一把,大部分情况都是大对象造成的,然后再结合自己的代码,看看哪个地方造成了对象创建后没有被回收,然后优化代码就好了。

如何排查 Full GC

有时候,我们只能在线上的服务器上通过命令排查,那么就只能使用命令行工具来排查了,其实思路也很常规:

  1. jps -l 找到当前进程的pid
  2. ps -mp-o THREAD,tid,time 定位到具体线程。
  3. printf “%x\n”,把线程 pid 转为16进制,比如 0xf58
  4. jstack pid | g rep -A 10 0xf58 查看线程的堆栈日志,还找不到问题继续。
  5. 实在没办法了,只能 dump 出内存文件用可视化工具进行分析了,然后 定位到代码后修复。

分析 YGC

大多数情况下,新创建的对象都会在新生代的 Eden 区中分配,当 Eden 区没有足够的空间分配时,虚拟机将会发生一次 Minor GC,也就是 YGC。频繁发生 YGC 也是会对性能造成影响的。

分析年轻代对象增长速率。

每5秒执行一次,执行10次,然后观察这50秒内 eden 区增加的趋势,即可知道年轻代对象增长的速率。

jstat -gc pid 5000 10

思路:如果 eden 区增长很快,那么发生 YGC 的频率也会很高,说明 Eden 区太小了,可以调大 Eden 区(调整 -Xmn 参数),然后再次进行测试,看小是否减少了 YGC 回收频率。

另外如果 YGC 后,存活的对象超过了 Survivor 的 50%,则会进入老年代。

我们的调优思路是尽量减少对象进入老年代,以减少发生 FGC 的频率。所以通过调整 Eden 区的大小,减少了对象进入老年代的频率。

参数调优

第三个方面,如何进行参数调优。一般情况下,参数用默认的就好了,但是某些场景还是要进行参数调优的。

调优思路如下:

  • 第一步肯定是看下到底配置了哪些参数:jinfo -flags pid。
  • 然后看下 Java 的版本,Java 7 和 Java 8 差别有点大的,Java 8 取消了永久区,新增了 metaspace 区,具体对 垃圾回收的影响,放到后面分享。查看 Java 版本的命令:jinfo -sysprops pid。
  • 一般设置-Xms=-Xmx,这样可以获得固定大小的堆内存,减少GC的次数和耗时,可以使得堆相对稳定。
  • -Xmn 设置新生代的大小,太小会增加 YGC,太大会减小老年代大小,一般设置为整个堆的1/4到1/3。
  • 设置-XX:+DisableExplicitGC禁止系统System.gc(),防止手动误触发FGC造成问题。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容