Jvm 内存溢出跟踪

JVM的错误之中,java.lang.OutOfMemoryError当属最常见,很多新手对此手无举措,只能各种所搜,配置-Xms -Xmx参数来增加内存,却找不到溢出的原因,其实JDK本身的工具为我们提供了内存溢出的跟踪方法,

这里我们建立一个简单的Demo演示下;

一,首先我们要主动的让Jvm内存溢出,这里我们建立个简单的java_project,结构如下:

在test类中,我们制造个死循环,代码如下:

package com.dtyunxi.test;

import java.util.ArrayList;
import java.util.List;

import com.dtyunxi.test.demo.Demo;

public class test1 {
	public static void main(String[] args) {
		List<Object> list = new ArrayList<Object>();
		while(true){
			list.add(new Demo());
		}
	}

}

Demo类中,就写个class,用来创建对象用,代码如下:

package com.dtyunxi.test.demo;

public class Demo {

}

为了让内存更快的溢出,我们给jvm指定一个内存(run configrations中配置VM参数)

此时启动main线程,控制台报如下错误:

这里因为代码简单,我们知道因为死循环中,不停的创建Demo对象,没创建一个对象,都会放入堆内存中,导致堆内存异常,但在实际项目中,代码都很复杂,不容易找到问题所在,这里我们借助Vm参数先给异常建立快照,在借助分析工具来分析溢出的原因:

此时在运行main方法,控制台出现如下信息

程序生成了快照,此文件在我们工程文件下,但是用编辑工具打开此文件,全是乱码, 我们没办法解读此文件,我们可以借助分析工具(MemoryAnalyzer)

下载安装方法都很简单,百度即可,这里不再赘述

用分析工具打开生成的快照文件会生成分析图

从图中我们可以看出问题可能发生在蓝色部分,他占据了大部分的内存,点击树状分析

发现问题发生在main方法里,他占据了94.23%的内存,点击该节点,

从图中可以看出该处在不停的创建对象,此时就定位出了问题,再根据实际情况对代码进行处理

猜你喜欢

转载自blog.csdn.net/oneofJava/article/details/81869839