java应用oom被kill排查记录
所属分类 java
浏览量 1552
某java应用压测时,java进程物理内存占用一直缓慢增加,最后进程占用内存过多,被kill
proc文件系统信息
当前工作目录
cwd -> /home/admin/xxx
exe -> /data01/soft/jdk1.8.0_151/bin/java
应用最小最大堆内存均为4G
jcmd 工具使用
主动触发GC
jcmd 26662 GC.run
查看性能信息
jcmd 26662 PerfCounter.print
jcmd 26662 VM.flags
jcmd 26662 VM.command_line
dmesg|tail -20
[987096.767585] Out of memory: Kill process 5039 (java) score 616 or sacrifice child
[987096.769898] Killed process 5039 (java) total-vm:14803740kB, anon-rss:11304244kB, file-rss:0kB, shmem-rss:0kB
dmesg -T
-T 时间格式化
jstat 查看堆内存 ,占用都很小 ,也没啥GC
jstat -gc PID 2000
jstack 查看线程数 也很稳定
jstack PID|grep java.lang.Thread.State -c
查看进程内存情况
/proc/[pid]/maps
/proc/[pid]/smaps
通过 smaps rss 内存占用 远远超过 JVM堆内存占用
可以确定是堆外内存泄露
一般考虑以下情况
netty 解压缩 本地方法调用
最后看了应用代码 ,发现 加密 解密时使用了 本地方法
char* data_decrpyt(char* key)
char* data_encrypt(char* key)
加解密本地方法内部使用了动态内存分配
char* chs = (char*) malloc(100);
但是后续没有正常释放内存,导致堆外内存泄露
上一篇
下一篇
科创板首批人工智能公司信息
CAP和一致性协议
MySQL基础架构
proc中进程内存信息
进程内存占用分析VSS/RSS/PSS/USS
elasticsearch5.0搜索偏好