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%的内存,点击该节点,

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

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值