大多数初学者编程都会犯一些非代码规范的错误(隐形错误:忘关IO流、死循环……),这就会导致对内存占着一些无用的资源而无法释放,导致CPU一直处于高占用率,就是重启Java进程,还是无法解决这个问题。一般公司,都有一套监管服务器的预警系统,一旦CPU使用率达到某个警戒值或者磁盘空间达到警戒值,就会预警,一般的处理方法有以下几种:
1、重启Java进程(能够释放大部分Java占用的内存)
2、重启服务器(如果数据库也占据当前服务器 这招就很管用)
3、使用清理Cache脚本(之前有一篇文章讲过 比较简单的几个命令)
4、扩内存(最直接有效的办法)
大多数公司都会从这几个方面入手,这也是我目前能想到的几个解决方法,但是作为一枚程序猿,还是很有必要从代码性能角度分析入手,而分析堆内存占用情况,MAT可是非常有用的工具。
MAT(Memory Analyzer Tool)是一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。
Eclipse安装MAT方法:help>-Eclipse MarketPlace>-搜索Memory Analyzer 然后install即可
安装成功,点击重启Eclipse,重启后打开window - > open perspective ->,看到Memory Analysis证明安装成功(上图所示)。
Java的内存泄露(主要特征:可达,无用)
1)无用指的是创建了,但是不再使用之后却没有释放
2)能重用,但是却创建了新的对象进行处理
3)不易察觉的死循环
public static void main(String[] args) {
// 100-999的随机数错误示范
int randomError = (int) (Math.random() * 1000);
while (randomError < 100) {
randomError = randomError * 10;
}
// 100-999的随机数正确用法
int randomTrue = new Random().nextInt(900) + 100;
while (randomTrue < 100) {
randomTrue = randomTrue * 10;
}
}
Math.random()的取值范围是大于0小于1
如果Math.random()的值为 0.00009以下...就成死循环了...
如何利用MAT进行分析呢?
点击Memory Analysis后,单机左上角file,点击Accquire Heap Dump: