线上 OutOfMemoryError 了,没头绪... ...

2020-05-07 12:36:54 +08:00
 Solace202

这是我第一次碰到 OOM,我不理解的是为什么我看 jvm.heap 里面,堆内存使用率不是百分百,但请求依然是 OOM 呢?这些堆栈文件是运维用脚本生成的,必要的话我可以把脚本贴上来。

我会继续排查问题,希望哪位看到了也能帮我瞅瞅,非常感谢。

6919 次点击
所在节点    Java
47 条回复
alexfarm
2020-05-07 12:46:47 +08:00
以前用过个工具 eclipse memory analyzer 去看 dump 的内容,稍微直观详细点,主要看看堆内存占用高的类
Lax
2020-05-07 12:47:57 +08:00
不太懂 java,不过看你输出里有个 PS Perm Generation 已经满了。
aircjm
2020-05-07 12:48:17 +08:00
这个应该是对象太大导致的吧?? 你可以用 eclipse 的那个分析工具分析下你的 dump 文件找下
Solace202
2020-05-07 12:58:47 +08:00
@alexfarm
@aircjm 谢谢,刚下载了这个工具,学着先用下。
hand515
2020-05-07 13:04:54 +08:00
你这里是两个进程? jmap 输出的第二段,明显 jvm 的内存配置都跟你贴的不一样,Perm Gen 才 24m
aircjm
2020-05-07 13:07:22 +08:00
@Solace202 客气,网上有教程的,可以先试试
lovedebug
2020-05-07 13:17:17 +08:00
我跟楼主说一个自己碰到过的。线上爆发的及其容易忽略的导致 oom 的点,所有 debug 和 info 级别 log 中不要打印整个 List/Set/Map,这些在运行中实际也是会计算的。
lovedebug
2020-05-07 13:18:10 +08:00
另外楼主应该为这个服务设置 health check api,可以今早发现问题。
lovedebug
2020-05-07 13:19:35 +08:00
PPS:先升级机器内存起一台新机器线上泡泡看看,这台出问题的机器可以从集群中移除仔细分析
pmispig
2020-05-07 13:34:49 +08:00
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/gc.hprof
加上这个
Livid
2020-05-07 13:35:28 +08:00
你们有在用 Sentry.io 么?
Solace202
2020-05-07 13:38:52 +08:00
@hand515 这是使用了两个 GC ( Mark-Sweep GC 和 Parallel GC ),jvm 里面配置是给第一个 GC 配的
![]( https://i.bmp.ovh/imgs/2020/05/56930920c1ac5a20.png)
yamasa
2020-05-07 13:39:41 +08:00
jmap -histo <pid>会按 mem size 对堆内对象排序,先看看前几名分别是啥。但是这种方式看不出对象树,所以比较大可能还是需要用 jmap dump 一个 bin 或者 hprof 下来,用 eclipse mem analyzer 直接分析。这个 analyzer 可以对一个 dump 出具 mem leak 的报表,要仔细看看,找到了高内存占用的类看看对象树,是不是你们哪里的业务代码造成了内存泄漏。
Solace202
2020-05-07 13:40:00 +08:00
@hand515 贴个配置和 jmap 的对应![关系图]( https://i.bmp.ovh/imgs/2020/05/56930920c1ac5a20.png)
Solace202
2020-05-07 13:41:43 +08:00
@Livid 没用过
Solace202
2020-05-07 13:42:22 +08:00
@pmispig 嗯,这个之前没加,我让运维加上,但是得再出个问题才能拿到。。。
yamasa
2020-05-07 13:42:59 +08:00
话说你们的 GC 是 CMS,可以用这个工具看看 https://github.com/DarLiner/vjtools/tree/master/vjmap 。 如果是 G1 的话反而用不了。这是可以分代的 jmap,如果 jmap 给出的分布看不出来问题就上这个,一个一个代区来分析。
Solace202
2020-05-07 13:54:33 +08:00
@pmispig 已经让运维加了,我们有 GC 的日志,但是没有日期,这个能否定位问题呢?可以的话我让在 JVM 把 gc 的日期和时间也加上?
limbo0
2020-05-07 14:11:53 +08:00
除了堆内存, 也得考虑下堆外内存,是不是有大量的网络请求
coolcfan
2020-05-07 14:13:14 +08:00
如果是 PermGen 满,结合日志内容,可以关注下应用里的反射操作或者是否存在动态的类生成……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/669244

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX