java.lang.OutOfMemoryError: Java heap space JVM内存溢出(堆溢出)

我先演示一下jvm内存溢出错误。

package com.sk.jvm;

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

public class Test003 {
	/**
	 * 运行这段代码必须堆内存10m以上
	 * 因为for循环循环了10次,每次生成了1m堆内存大小
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("堆的最大内存"+Runtime.getRuntime().maxMemory()/1024.0/1024+"m");
		System.out.println("堆的可用内存"+Runtime.getRuntime().freeMemory()/1024.0/1024+"m");
		System.out.println("堆的已经使用内存"+Runtime.getRuntime().totalMemory()/1024.0/1024+"m");
		// -Xms1m -Xmx10m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
		List<Object> listObject = new ArrayList<>();
		for (int i = 0; i < 10; i++) {
		System.out.println("i:" + i);
		Byte[] bytes = new Byte[1 * 1024 * 1024];
		listObject.add(bytes);
		}
	}
}

运行这段代码必须堆内存10m以上,new 出来的对象存储在堆里面,因为for循环循环了10次,一共new了list10次,每次生成了1m堆内存大小

我然后通过  -Xms1m -Xmx10m设置jvm的初始内存和最大内存(如果不设置的话会有默认的,这里的话默认的内存肯定是可以运行的,所以我把jvm内存设置小一点给大家演示一下这个错误)

操作:(eclipse)右键--》Run Configurations--》(在左边导航栏里)java application--》项目名称(如果没运行要先运行一遍)--》arguments--》在vm arguments添加参数-Xms1m -Xmx10m--》run

运行结果:

出现错误的原因:我配置了最大堆内存才10M,而这个for循环里面就需要10M的堆内存,如果你设置11m或者12m也会发现不行,其他的地方还占用了一定的堆内存(比如ArrayList底层封装了一个数组,这个数组也会占用一定的内存,还有等等...占用内存,这里不做过多的讲解),设置100m就可以了。这里你会发现有些误差,这是正常的。

如果你运行中遇到这个错误可以使用

System.out.println("堆的最大内存"+Runtime.getRuntime().maxMemory()/1024.0/1024+"m");
		System.out.println("堆的可用内存"+Runtime.getRuntime().freeMemory()/1024.0/1024+"m");
		System.out.println("堆的已经使用内存"+Runtime.getRuntime().totalMemory()/1024.0/1024+"m");

查看一下堆的最大内存,然后再适当的添加堆内存,就可以解决。

这里如果有不了解jvm参数配置的,可以去了解下我博客里面的jvm参数配置

猜你喜欢

转载自blog.csdn.net/qq_41383905/article/details/89052385