jvm内存问题诊断-1

运维网站上有个监控,可以看到我们服务器的内存,我们很惊奇的发现,我们的应用占据了越来越多的内存,而且上线15天以来,一直都在在上升,从最初的2G达到了现在的8G。

难道这就是传说中的内存泄漏?

于是一个诊断过程就此开启。

首先从操作系统入手,我们用的是linux 64位的服务器,在同事的指导下我知道了top的命令。于是我就用ps找到pid,再用

top –p 1111

找到了内存结果:

image

一看,res 1.9G,注意res的全称是RESIDENT,不是RESERVED。看来确实占了不少内存。

第二阶段开始。我想看看是什么东西占了内存,于是我用jvisualvm连上去看下。找了下资料,需要tomcat上开启jmx远程连接,看了眼catalina.sh居然已经开启了,当然线上机是有密码的,再仔细一看,密码居然存在一个文件里,刚好我可以看到这个问题。于是我用jvisualvm连了上去:

image

heap居然只用了不到1G,当然jvm的内存也不只是heap还有perm,stack什么的,perm我看了只有100M,stack不太好看,但是我只看到200个thread,就算每个占1M,也就200M,不会有决定性的变化。

第三个阶段,那么有没有可能是我们用了heap之外的内存。nio之类。还好有jmap:

image

怎么样,都不大吧,怎么也不会搞到几个G。

第四个阶段,我决定换个思路。也许我们的程序没有问题。接着发现jvm并不会立刻释放内存,和MaxHeapFreeRatio以及MinHeapFreeRatio有关。但是又发现如果xmx和xms一样,这个选项不生效。这就是说jvm压根儿就不想释放内存,到了xmx再说吧。

总结一下,用top,jvisualvm,jmap来发现问题,后来发现是jvm参数的问题。

Technorati Tags: jvm,memory,heap,top,jmap,jvisualvm
posted @ 2013-06-02 09:59  永远是学生  阅读(966)  评论(0编辑  收藏  举报