首页   快速返回

java应用oom被kill排查记录
文章分类 java
发布时间 2019-01-28 修改时间 2019-01-28
某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


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搜索偏好