我先演示一下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参数配置