前言
分享一个最近的问题,top 看java进程res不断升高,一天能涨3个G,使用jmap dump内存快照后,dump下来的文件只有300多M,没有发现内存泄漏。这是个什么情况呢,我们深入分析下。
冰山一角
首先,使用top来查看下当前进程的信息

请添加图片描述
可以看到top的res占用5.3g,jvm的参数如下
-Xmx8192M -Xms8192M -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDetails -XX:+PrintGCDateStamps -verbose:gc -Xloggc:/opt/ass/gc.log
早上的时候是4个g,下午的时候涨到7个g。
通过gc日志和gc次数和时间来看,fullgc并没有有效的清理掉内存。
我们使用jmap -histo:live pid手动触发一次fullgc,发现res还在持续增长,也就是说内存肯定有泄漏的地方。
使用jmap dump出内存,查看泄漏的地方</

本文记录了一次Java进程内存资源(res)异常增长的排查过程。通过top命令观察到进程内存持续升高,但jmap dump出来的堆内存并无明显泄漏。进一步分析发现,问题可能出在堆外内存。尝试使用NMT进行 native 内存跟踪,但由于使用的是JDK 1.6而不支持。接着,通过ps、pmap等工具分析,最终在gdb中发现内存中存储了未正常关闭的请求和响应数据,怀疑存在资源未释放的问题。
订阅专栏 解锁全文
1万+

被折叠的 条评论
为什么被折叠?



