线上问题排查异闻录

如何解决堆内存溢出问题

OOM有很多种情况啊,这里就先讲解最常见也是最容易观测的java.lang.OutOfMemoryError: Java heap space,也就是堆内存溢出。

发现

启动Java程序的时候,最好参数加上-XX:+HeapDumpOnOutOfMemoryError,该参数不影响程序运行,运行时没有任何开销,只有OOM时会自动生成Java Heap Dump(特定时刻 JVM 内存中所有对象的快照)。该文件默认会在运行应用程序同级目录下生成一个格式为hprof的文件,当然也可以使用参数-XX:HeapDumpPath=/data指定生成到data文件夹下。

这里说一下我对于Java程序运行添加参数的一些理解,这是我项目的一个常规启动命令,java -javaagent:/usr/local/app/skywalking_agent_zy/skywalking-agent.jar -Dskywalking.agent.service_name=appName−Dskywalking.collector.backendservice={appName} -Dskywalking.collector.backend_service=appName−Dskywalking.collector.backendservice={skywalkingIp}:skywalkingPort−Dskywalking.plugin.toolkit.log.grpc.reporter.serverhost={skywalkingPort} -Dskywalking.plugin.toolkit.log.grpc.reporter.server_host=skywalkingPort−Dskywalking.plugin.toolkit.log.grpc.reporter.serverhost={skywalkingIp} jvmoption−Dserver.port=8080−Denv=jvmoption -Dserver.port=8080 -Denv=jvmoption−Dserver.port=8080−Denv={env} -jar /usr/local/app/app.jar。${}占位符这里是在DevOps上面配的,当然大家也没必要关注,嘻嘻。这里这个env是公司框架让配的环境参数,前面Javaagent一堆参数都是skywalking要用的。

除开这些客制化的东西,对于普通的应用,一般配置堆大小相同比较好,因为通常来说一个服务器或者容器只会有一个Java应用,释放内存给谁用呢,是吧,没那必要。JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64,JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制,空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此一般设置-Xms、-Xmx相等以避免在每次GC后调整堆的大小。

定位

拿到hprof文件后,可以选用jvisualvm(Jdk8之后不自带,需要到Github上下载)、JProfiler和IDEA的Profiler(旗舰版才有)打开文件,三者的操作逻辑都是类似的,目前我用的最舒服的是JProfiler,以下就拿JProfiler截图举例。

导入hprof文件到JProfiler之后经过解析,默认会跳到该界面,这里直接选上面的最大对象,继续解析。

这里右键选定比较大的对象后会弹出这样一个框,选择引用-传入引用。为啥是传入引用呢,因为我们要找问题的源头啊,哪里来的才是比较重要的。

找到对应堆栈信息,点击显示更多,即可发现带恶人。

以上就是一次完整的查询过程,如果点开发现都是差不多的内容,为了少点几次,保护鼠标,我建议可以换成旭日图更加便捷地查看

可以观察到相对类型地这个对象比较多啊,这里点击一下这块进入内部查询

如何解决CPU占用高问题

CPU占用高的问题就没有挂了之后自动dump文件的好事了。这时候需要善用jstack、监控和Arthas等工具。

发现

正常来说,咱们会有监控软件去监控服务器的一些性能指标,我这用的是Prometheus+Grafana,非常大众哈。

如图可以观察到一个服务器CPU占用的折线图,配合告警可以及时通知相关人员定位问题。

定位-传统武学

通过上面地监控及时发现问题,接下来就该上手具体的操作了。

  1. top -o %CPU,Linux上按CPU从大到小排序,找到占用最多的PID(这里假设是Java应用)
  2. jstack pid > thread.txt,通过jstack命令打印当前Java应用的堆栈信息
  3. top -Hp pid,通过该命令观察此pid进程中所有线程的CPU占用
  4. 找到线程pid,通过命令printf '%x\n' pid得到转换为16进制的nid
  5. 在jstack获得的文件thread.txt中,找到nid对应的线程堆栈信息,找到对应代码块即可
  6. 通常除了CPU占用过高的线程,还需要重点关注线程状态为BLOCKED、WAITING和TIMED_WAITING的部分

定位-新派宝典

我一开始接触的也是传统武学,啪啪啪一堆命令敲得也是非常麻烦嗷,那有没有开箱即用的好东西呢。没错,那肯定是有的,就是大名鼎鼎的Arthas啦。

  1. 下载Arthas.jar,curl -O arthas.aliyun.com/arthas-boot…
  2. 运行java -jar arthas-boot.jar并选择需要监听的Java应用,图形化很赞
  3. 输入命令dashboard打开看板,随时监控,默认5000ms一刷
  4. 针对上面CPU问题,直接选择Thread系列命令

效果如下,牛中牛中牛,解放双手。相比jstack输出的文件,甚至多了cpuUsage这个参数,更加直观。

Arthas还有很多别的牛逼功能,不仅仅是Jdk工具的一个打包,更是对前者进行了易用性上的极大优化,同时也提供了很多新功能,要知道这玩意才一百多KB啊。

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

推荐阅读更多精彩内容