日期:2014-05-20  浏览次数:20647 次

判别java应用代码 有内存泄漏??
疑问
我当前应用是 mysql+ linux + java + tomcat 全部同台机器
在linux top命令
观察java占cpu为99.9% 内存87.3% mysql 占内存为3% cpu为0

是否可以判别java应用代码 有内存泄漏??

------解决方案--------------------
打开你的gclog,看每次的gc情况,如果每次full gc后剩下的内存一直在上涨那就危险了,或者也可以通过专业工具jprofile之类的
------解决方案--------------------
一种用 profiling 工具,查找一个使用了最多内存的类是什么,再找花费最多时间的方法。
二种打开代码检查每一个 循环,一般来说一种无固定边界的循环
(如:while(isRunning) { ... } ) 这种循环可能在里面有太多的对象未释放。以前我们记得在一个 {} 退出时里面的对象都会被释放,但在 Java 中则不一定,除非你明确使用 a = null,否则很可能它只在退这个方法才释放而不是我们期望的退出块就释放。


------解决方案--------------------
探讨

一种用 profiling 工具,查找一个使用了最多内存的类是什么,再找花费最多时间的方法。
二种打开代码检查每一个 循环,一般来说一种无固定边界的循环
(如:while(isRunning) { ... } ) 这种循环可能在里面有太多的对象未释放。以前我们记得在一个 {} 退出时里面的对象都会被释放,但在 Java 中则不一定,除非你明确使用 a = null,否则很可能它只在退这个……

------解决方案--------------------
观察java占cpu为99.9% 内存87.3%

如果持续的cpu占用99.9%并且内存不断增长,那就是有死循环,并且有内存泄露
另外注意一下你的linux系统和你的服务器配置
有的linux系统在top时候显示不支持多核cpu,这种情况下,会显示一个cpu,但是实际上会超过100%
99.9%并不意味着cpu被沾满了,注意下idel是多少,如果idel没了,就是cpu被占用过高
比如如下:
Cpu(s): 27.2% us, 0.1% sy, 0.0% ni, 72.0% id, 0.7% wa, 0.0% hi, 0.0% si
其中72%id是说明空闲cpu
top的进程列表里显示java 99.%,但是实际并不是沾满了
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
 8913 root 16 0 712m 584m 6516 S 99.9 28.8 5369:32 java