最近公司有个java项目,上线部署初期运行一段时间后内存占有量一直上升、cpu保持至60%~70% 至死机,然后查找代码中可能内存泄露的地方,修改优化代码后,对jvm的设置如下:
JAVA_OPTS="$JAVA_OPTS -server -Xms1600m -Xmx1600m -XX:NewSize=256m -XX:MaxNewSize=512m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:ParallelGCThreads=2 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -Djava.awt.headless=true"
重启tomcat运行3~4小时后,top查看java进程达到1.8G时,浏览很慢直至tomca还是照样t死机!
(此时日志未报出内存溢出的信息!)
再次优化代码,其它设置未改,部署上去后不到半个小时内存耗光,tomcat死机,然后把上述的GC设置 :
JAVA_OPTS="$JAVA_OPTS -server -Xms1024m -Xmx1600m -XX:NewSize=256m -XX:MaxNewSize=512m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:ParallelGCThreads=2 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -Djava.awt.headless=true"整行全部去除,内存反而上得很缓慢了,而且有1~3m的回退现象,用netstat -nat|grep -i "80"|wc -l查看连接数保持在200至300左右,又运行2小时之后cpu却不断地上升为25%至30%之间.
(测试日志又未报出内存溢出的信息!)
这样的情况下,俺就超级郁闷再加狂晕了......:
1.为什么我没有指定-XMS -XMX和GC(去除整行)内存反而上得很缓慢了,而且有1~3m的内存回退现象(运行3-4小时系统稳定,就是CPU稳步上升!)
2.既然要想释放更多的内存,我就添加上:JAVA_OPTS="$JAVA_OPTS -server -Xms1600m -Xmx1600m -XX:NewSize=256m -XX:MaxNewSize=512m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:ParallelGCThreads=2 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -Djava.awt.headless=true"
为什么内存占用消耗更快?而且达到GC的-XMS的时候,完全没有回退现象,而且更快死机!难道以上写JVM不起效,反而成为占用内存的杀手?
各位高手帮俺分析下,万分着急,寝食难安,身心憔悴,在下感谢万分!!
敬礼!
2008-3-13