[讨论] 遇到jvm堆外内存泄露,更新jvm也无法解决

stevenprime 2015-01-07
我最近遇到jvm内存泄露:
一台服务器是4G内存,上面跑着两个java应用,每个的Xmx为2048m,MaxPermSize为256M。每过一段时间swap分区报警,用top看占用2.9G。使用查看swap分区的攻击看了一下,大部分是java占用的。怀疑内存分配不合理,导致占用过多内存,内存不够时占用swap,就将Xmx从2048M改为1536M,MaxPermSize从256M改为128M(通过gcutil看了,改了后,内存空间还是够用的)。但是仍然还是报警。

在网上搜了一篇文章。
具体是说在jdk1.6u32版本以前jdk 是有一个bug,使用CMS垃圾回收策略在DirectByteBuffer销毁后,不会对他对应的内存释放空间,会导致内存泄漏。这个bug在1.6u32后得到了解决。

我的jdk原来是1.6u20,于是我将jdk升到1.7u45,但是奇怪的事情发生了。
还是没有解决这个问题。
jdk的堆占用1536+128=1664M,但是通过top看进程占用了2.2G,也就是有2.2*1024-1664=588M的堆外内存。

求大家指导,如何解决这个问题。
Ferdiknight 2015-01-14
可以确认下是不是线程栈占用的空间
Global site tag (gtag.js) - Google Analytics