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

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

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

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

6919 次点击
所在节点    Java
47 条回复
Solace202
2020-05-07 14:15:18 +08:00
@limbo0 凌晨一般产品就没人使用了,只是凌晨一般会议很多定时任务开始执行
25OHd2qObJmJ6P10
2020-05-07 14:17:38 +08:00
从应用日志来看是 spring 注入一个类的时候报了堆空间不足,spring 注入属性会去加载相应的类到永久区,根据你的日志分析,你的 jdk 应该是 1.8 以下,而且你的 jvm 内存空间也显示你的永久区只有 24M,使用达到 99%,所以初步分析就可以增大永久区 -XX:PermSize=75M -XX:MaxPermSize=100M 尝试,然后再根据 jstat 和 jmap 分析内存变化,确定原因以及调整最合适的 jvm 参数
Solace202
2020-05-07 14:26:56 +08:00
@rayduan 我是有个地方不理解,两个 GC,为什么注入的类会放到下面这个 GC 的 Perm Generation 而不是上面的那个 Perm Generation ?
zwx327634
2020-05-07 14:31:50 +08:00
如果是 jdk1.7,升到 1.8 就没问题了,永久代变成元空间,放在堆里了。快速的话就是像楼上,增加永久代空间
Solace202
2020-05-07 14:48:23 +08:00
@zwx327634 jdk1.6,瑟瑟发抖,老项目快十年了
1ffree
2020-05-07 15:05:50 +08:00
好奇应用运行期间 还有 autowire 是啥使用场景呢
pangleon
2020-05-07 15:07:44 +08:00
你这个提示的是 heap space 而不是 permgen space,后者是永久代满了,那么基本上可以定位到你们的程序创建了大量的临时对象

如果真是凌晨 OOM,凌晨也不是用户高峰那么基本可以确定是定时任务导致的。
你可以查询下有哪些定时任务在运行,他们是否创建了大量的 LIST,MAP 这种集合类对象或者拼接了大量字符串对象。
pmispig
2020-05-07 15:15:31 +08:00
@Solace202 -XX:HeapDumpPath=/logs/gc.hprof 看看能不能重现一次,拿到这个 dump 出来分析就比较好定位
liukzz
2020-05-07 15:16:37 +08:00
https://gceasy.io/gc-index.jsp 这个网站下个离线版的分析工具,把 gc.log 导进去分析下
Solace202
2020-05-07 15:28:46 +08:00
@pmispig 嗯,已经在 jvm 加了,今晚要是再出现就好处理了。
gadsavesme
2020-05-07 15:45:01 +08:00
Perm Generation 满了,这个 jdk1.8 以下的时候 fullgc 的时候不会清理空间,满了就 oom 十分蛋疼。
bonke
2020-05-07 16:00:18 +08:00
hashMap 的 key 是重写了 hashCode 方法么 看下有没有重写 equals 方法
admol
2020-05-07 17:05:15 +08:00
推荐一下这个工具 https://console.perfma.com/
chibupang
2020-05-07 17:31:03 +08:00
我看 OOM 日志错误是在“work”反射调用的时候,是不是创建了大内存对象。
kingwang
2020-05-07 17:57:40 +08:00
应该是出报表的时候跪了,看一下这些报表里会不会象楼上们所说的产生大量集合对象
iFlicker
2020-05-07 17:59:47 +08:00
如果是 macOS 我推荐 Jprofiler ,平时 Android dump 堆内存查问题就是用这个看 比 as 强大
EmdeBoas
2020-05-07 18:04:08 +08:00
机器内存多大?
cheng6563
2020-05-07 18:15:46 +08:00
强烈推荐 Jprofiler 来观测 jvm 内存转存。轻松找到哪有问题
Huozy
2020-05-07 19:40:30 +08:00
用的 was 吗?看看 was 控制台最大内存和最小内存是多少,如果操作的数据多了 超出一定范围会报内存溢出的
Solace202
2020-05-07 20:34:05 +08:00
@Huozy was 是啥? AWS 吧?不是 AWS

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

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

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

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

© 2021 V2EX