为何我的java项目运行一段时间后,物理内存使用越来越高?

Tek_Eternal 发布于 2015/01/03 21:27
阅读 14K+
收藏 0
公司的一个运行在tomcat上的java ee项目,主要功能上是作为接口服务器。服务器上物理内存8G,tomcat启动时jvm初始堆内存以及最大堆内存都设置为1400M,项目运行起来后,物理内存还剩快2G的样子。但是慢慢运行几天后,用top命令看内存使用情况,java进程占用的内存越来越多,最后把物理内存用满了,但是之后就不会在增加(不会去用swap),同时,tomcat性能上感觉没有什么影响,也不会抛出OOM什么的,负载低的时候cpu使用率也不超过10%。

后来针对这个项目有做过接口的压力测试,接口内部处理逻辑就是接受请求报文后保存到数据库,压测30分钟,机子的物理内存也是越用越多,到最后用满,但是接口的响应速度没有什么影响。整个压测过程,我用visualVM观察jvm的情况,发现堆内存基本上只用了500多M,还没达到最大值(项目启动时给虚拟机分配的初始值和最大值是1400M)。压测结束后,有50多个线程是live状态(tomcat配置的最大线程数300),看了下ThreadDump 貌似都是http请求相关的线程。


我想请教下,这种情况是否正常?既然分配的堆内存都没用完,那些后来慢慢增长的物理内存用在哪些地方了(难道是线程的栈内存?),为什么随着负载降低,这些物理内存没被释放掉呢。


这里贴下项目的JVM启动参数和tomcat server.xml设置的一些参数:
export JAVA_OPTS="-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "

----------

<Connector port="9010" protocol="HTTP/1.1"
IEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75"
disableUploadTimeout="true"
acceptCount="300" maxThreads="300" maxProcessors="1000" minProcessors="5"
useURIValidationHack="false"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
URIEncoding="UTF-8"
--------------
小弟对JVM优化的经验基本为零,各位大大能解惑的话,不胜感激,顺便跪求JVM优化相关的书籍?T_T
加载中
0
l
lhjiang
这应该是linux系统的缓冲吧,你可以用free命令查看一下你真实使用的内存是多少。
0
蔡佳娃
蔡佳娃
哈哈,真巧啊。之前我给别的项目组做了一个web的管理系统,他们也跟我说过这个问题。后来我排查方法和你一样。不是java的问题,只要没OOM,就不存在内存泄露的问题。还有一个问题得注意,是不是JAVA占用的内存超出了你设置的值,如果是,是不是考虑什么地方使用了NIO,这部门内存是内核层的,不属于用户层,可能看不出来。
蔡佳娃
蔡佳娃
不用操心了
Tek_Eternal
Tek_Eternal
3Q! 我发现堆内存没有超出,系统也运行正常,所以才觉得纳闷=口=
0
蔡佳娃
蔡佳娃
书的话看看JVM性能调优
0
JacarriChan
JacarriChan
把JVM dump出来。然后用mat分析
Tek_Eternal
Tek_Eternal
嗯。。dump出来了,堆内存使用正常
0
Tek_Eternal
Tek_Eternal
后来发现是我查看内存的方式有问题,用top命令看到的Mem使用率是包括buffers和caches的,如果用free看的话,其实内存使用率没那么高,大部分都是缓存,这是linux的内存管理机制?
0
甘薯
甘薯

你如果是用linux系统,

那么这种情况应该是正常的,只要系统稳定, 没啥好担心的.

0
朱宏青
朱宏青

你设置了1400m 怎么可能会超过这个值 超了就相当于OOM了(可以去看看gc的机制)

用TOP命令不合适吧 还是用jvm监控的东西 最简单的jconsole也能看到大致情况

一般情况下 cpu没满负荷 没有OOM 系统运行正常 那就没有问题

Tek_Eternal
Tek_Eternal
嗯,我就好奇为什么top命令看到的内存都是满的,看来是我关注错地方了,应该用free来看,linux运维知识欠缺啊。
0
Tek_Eternal
Tek_Eternal

引用来自“lhjiang”的评论

这应该是linux系统的缓冲吧,你可以用free命令查看一下你真实使用的内存是多少。
嗯,用free命令看的话就是正常了,top下看到的是cache+buffers的内存使用情况,实际上没那么多 
返回顶部
顶部