1
nickchenyx 2020-03-04 15:21:38 +08:00
看你这个打印有点问题啊,你的 From&To Space 占用太高了,young gen 里,From&To 和 eden 的比例应该是 2:8,你这个不要修改默认配置。
这里看你的 heap usage 没啥问题啊,在 jvm 启动的时候加上参数打印一下在 gc 的时候以及 oom 的时候内存分布情况 -XX:ErrorFile=./hs_err_pid%p.log -XX:HeapDumpPath=./ -Xloggc:./gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintHeapAtGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps |
2
jiashun 2020-03-04 15:27:00 +08:00
看程序 GC 正常不,如果 GC 正常,没有频繁 GC (堆内存对象正常回收),可以把目光转向非堆内存,排查下哪里用到了 NIO,有没内存泄露
|
3
yidinghe 2020-03-04 15:33:41 +08:00
如果光看总量看不出问题,那么就要把内存 dump 出来看具体哪些对象占用了内存
|
4
yanyueio 2020-03-04 15:42:13 +08:00
与上面几位大佬说的基本思路一致,主要看 GC 是否正常(一般就是这里),不行的话在看具体的对象占用内存量。
个人觉得栈的话一般不用看,至少我还没有遇到过栈空间问题。 补一补 JVM 的知识吧,类似于搞 C/C++ 的必须知道进程的结构一样。 |
5
CodeXx OP |
6
CodeXx OP @yidinghe dump 出来的文件 1g 多,内存占用高的是 org.apache.mina.transport.socket.nio.NioSocketSession 占了 400 多 m。但程序系统占用了 2g 多,感觉还有一部分内存没有查看到
|
7
liuming 2020-03-04 18:36:33 +08:00
看 heap usage,实际堆空间显示还有不少空闲,当需要在堆上分配空间的时候不该出现 OOM: Java heap space 这样的错误提示,除非系统的空闲内存不足了,也就是堆外内存有泄漏、终于耗尽了系统的剩余内存,可是如果是这种情况,系统的表现不该是死机之类的么?
|
9
gaius 2020-03-04 19:27:18 +08:00 via Android
日志里打印的是什么样的,mina netty 这种多和堆外泄露有关,netty 的话会抛自己的异常,mina 不清楚,而且也不该是 heap space。
|
10
CodeXx OP @gaius 确实可能是堆外的,我手动 gc 后堆内存只占几十 m 了,但是程序占内存还是 2g。日志报的错贴出来了,请问大佬这种堆外泄漏要怎么查啊。
|
11
liuming 2020-03-05 00:15:30 +08:00
看了下 Thumbnailator 在 github 上的 issue,不少堆上出 OOM 的……比如 https://github.com/coobird/thumbnailator/issues/111,根据这 issue 里作者的说法,Thumbnailator 挺耗内存的,尤其是你这貌似在多线程使用……不过这应该不是程序内存占用远远大于堆实际占用的原因,但应是导致 OOM 的原因。怎么排查堆外泄漏可以参考下这个视频,视频里介绍了不少实际工具:
|