堆内存分析:
1、没有修改VM 参数
运行以下示例:
public class Demo2 {
public static void main(String[] args) {
//返回虚拟机试图使用的最大内存
long max = Runtime.getRuntime().maxMemory();//字节 1024*104
//返回jvm的总内存
long total = Runtime.getRuntime().totalMemory();
System.out.println("max="+"字节\t"+(max/(double)1024/1024)+"MB");
System.out.println("total="+"字节\t"+(total/(double)1024/1024)+"MB");
//默认情况下: 分配的总内存 是电脑内存的1/4,而初始化的内存: 1/64
}
}
结果:
因为我的电脑内存为16g,所以可以看出默认情况下:分配的总内存 是电脑内存的1/4,而初始化的内存: 1/64
2、堆内存大小是可以修改的。
修改VM options如下图所示
再运行代码:
public class Demo2 {
public static void main(String[] args) {
//返回虚拟机试图使用的最大内存
long max = Runtime.getRuntime().maxMemory();//字节 1024*104
//返回jvm的总内存
long total = Runtime.getRuntime().totalMemory();
System.out.println("max="+"字节\t"+(max/(double)1024/1024)+"MB");
System.out.println("total="+"字节\t"+(total/(double)1024/1024)+"MB");
//默认情况下: 分配的总内存 是电脑内存的1/4,而初始化的内存: 1/64
}
//OOM:
//1、尝试扩大内存看结果
//2、分析内存,看一下那个地方出现了问题(专业工具)
//-Xms1024m -Xmx1024m -XX:+PrintGCDetails
}
结果:
从上面图中可以看出,JDK1.8的堆中有年轻代(PSYoungGen)、老年代(ParOldGen)、元空间(Metaspace)
OOM错误示例:
先修改堆内存为小内存
//-Xms8m -Xmx8m -XX:+PrintGCDetails
后运行以下代码:
public class Hello {
public static void main(String[] args) {
String str = "kuangshensayjava";
while(true){
str += str + new Random().nextInt(888888888) + new Random().nextInt(999999999);
}
}
}
结果:
VM option参数解释:
-Xms 设置初始化内存分配大小 默认为 1/64
-Xmx 设置最大分配内存,默认为 1/4
-XX:+PrintGCDetails 打印GC情况
-XX:+HeapDumpOnOutOfMemoryError Dump出OOM错误