Java服务进程内存分析

做了个非常轻量级的JAVA HTTP服务,基于evnet2.0。基本上所有的方面都还可以,只有一个我觉得有些奇怪,需要好好查查。这个方面,就是对内存的占用。

对比以前C做的HTTP的服务,内存差了大概2个量级。C的服务,逻辑也简单的,大概5M就可以了, 但是JAVA的,运行一段时间要100M。

现象是: 服务启动完成的时候,占用内存25M,但是运行几千个请求之后,变100M了。这个是用Linux的ps命令看的。

到底这么多内存都花在哪里了呢,会不会有内存泄漏? 于是就有了对JAVA进程内存的分析。

一个JAVA进程的内存,分两个大部分,一个是堆内存,这个是JVM执行各种new出来的对象所用的;一个是Jvm进程执行需要的非堆内存。

所以着重分析这两个部分。

我用的工具有两个,都是Jdk自带的,一个是jcmd,一个是jmap。至于用法,不写了,百度即可。临时记录几个命令:

java -Xms15m -Xmx15m -verbose:gc -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5M -XX:MaxMetaspaceSize=32m -XX:ReservedCodeCacheSize=3m -XX:NativeMemoryTracking=summary -jar RM_Dev.jar &

ps -aux | grep RM_Dev

jcmd 7729 VM.native_memory summary > GGGGG_444444.TXT

jmap -heap pid

首先我用Jmap查看了堆,发现堆用的内存很少,一直稳定在我给它设定的16M,很稳定,GC触发的次数也没有,所以堆内存木有问题。

然后用jcmd对整体的Java进程的内存进行了打印。发现运行一段时间后,内存增加的地方,主要就是Code与Class,其他则可以忽略不计。另外,还有个明显的现象,由NMT打印出来的内存,并非如ps命令看的那么奇怪。它启动之后,是74M左右;运行一段时间之后,是87M左右。也就是说,变化了大约13M。不是从25M到100M。

至此,基本可以得出结论,没有任何的内存问题,就是JAVA要的内存多。一个Java的轻量级服务如果想跑的顺利些,基本不能少于200M的内存给它。

这个也跟TOMCAT对内存的要求差不多。

Java服务进程内存分析