【JVM学习笔记】(一)、初体验-内存溢出问题分析及解决方案

一、 开始
创建Main类和Demo类,在Main类的main方法中创建List,并向List中无限创建Demo对象,造成堆内存溢出,
并输出内存溢出错误文件在项目目录下,为了使等待时间减小,设置运行堆内存大小。
#####2. 创建Demo类

package com.cheng.test1;
/** 
 * @ClassName: Demo 
 * @Description: TODO
 * @author: Cheng
 * @date: 2018年4月24日 上午11:01:44  
 */
public class Demo {
	
}

二、 创建Main类,循环创建对象 造成堆内存溢出

package com.cheng.test1;

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

/** 
 * @ClassName: Main 
 * @Description: Java堆内存溢出
 * @author: Cheng
 * @date: 2018年4月24日 上午11:01:37  
 */
public class Main {

	/** 
	 * @Title: main 
	 * @Description: TODO 
	 * @param args void
	 * @author Cheng
	 * @date 2018年4月24日上午11:01:37
	 */
	public static void main(String[] args) {
		List<Demo> list = new ArrayList<>();
		// Java堆中用于存储对象,通过不断创建对象的方式可以造成堆内存溢出
		while (true) {
			// 将对象放入list中,使GC Roots到对象之间有可达路径,防止垃圾回收机制清除new的对象
			list.add(new Demo());
		}
	}
}

三、 运行
在Eclipse中进行运行

Run As ->Run Configurations

运行之前设置JVM参数:
在这里插入图片描述

 -XX:+HeapDumpOnOutOfMemoryError -Xms20m -Xmx20m

参数解释:

-XX:+HeapDumpOnOutOfMemoryError:可以让虚拟机在堆内存溢出时 Dump 出当前的内存堆转储快照,会保存在项目目录下,用于分析;
-Xms20m -Xmx20m:将堆得最小值-Xms参数与最大值-Xmx设置成一样,则堆大小不会自动扩展。

运行结果,可以在看到控制台有打印错误,提示 OutOfMemoryError:Java heap space ,无疑是Java堆内存溢出。
这里写图片描述

四、原因分析
运行之后,会在项目的目录下生成 java_pid3500.hprof 之类的文件,用于记录内存溢出,需要在JVM参数中进行设置,-XX:+HeapDumpOnOutOfMemoryError。

这里写图片描述

使用Eclipse的MemoryAnalyzer(专业用于分析dump文件的工具,需要自行下载安装)打开文件
分析结果:
这里写图片描述

可以看到,代码一直在创建 com.cheng.test1.Demo类的对象而造成堆内存溢出。

欢迎关注公众号:【皮卡战记】

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值