简介
何为内存溢出
内存中剩余的内存不足以分配给新的内存请求就会内存溢出。内存溢出可能直接导致系统崩溃。
内存溢出的原因
内存泄漏是导致内存溢出的一种原因,但内存溢出不全是由内存泄漏引起的,还可能是:
1)创建的对象太大导致堆内存溢出
2)创建的对象太多导致堆内存溢出
3)方法出现了无限递归调用导致栈内存溢出
4)方法区内存空间不足导致内存溢出。
内存溢出实践
大对象导致堆内存溢出
第一步:编写如下代码,例如
package com.java.jvm.oom;
/**
* JVM 参数配置
* 1)最大堆-Xmx5m
* 2)最小堆-Xms5m
*/
public class BigObjectOOMTests {
public static void main(String[] args) {
byte[] array=new byte[1024*1024*5];
}
}
第二步:idea中配置JVM运行参数,设置最大堆、最小堆内存大小,例如
第三步:运行程序出现OutOfMemoryError异常
频繁创建对象导致内存溢出
第一步:编写如下代码,例如:
package com.java.jvm.oom;
import java.sql.Time;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* JVM 参数配置
* 1)最大堆-Xmx100m
* 2)最小堆-Xms100m
*/
public class ManyObjectOOMTests {
public static void main(String[] args)throws Exception {
List<byte[]> list=new ArrayList<>();
while(true) {
byte[] array = new byte[1024 * 1024];
list.add(array);
TimeUnit.MILLISECONDS.sleep(500);
}
}
}
第二步:idea中配置JVM运行参数,设置最大堆、最小堆内存大小,例如
第三步:运行程序,基于VisualVM监控内存变化(VisualVM需要安装GC插件),例如:
第四步:当年轻代、老年代都满的时候,打开idea控制台,检查是否出现了OutOfMemoryError异常。例如:
小节面试分析
- 何为内存溢出?
- 你知道哪些内存溢出类型?
- 如何更好避免内存溢出?