当一个Java程序报OOM的异常的时候,程序会gg吗?是只有一个线程gg呢,还是整个进程gg呢?
/**
* JVM 堆内存溢出后,其他线程是否可继续工作
*
* @author LiXuekai on 2020/7/27
*/
public class WhenOom {
public static void main(String[] args) {
new Thread(() -> {
List<byte[]> list = new ArrayList<>();
int i = 0;
while (true) {
System.out.println(new Date().toString() + " ---" + i++ + " "+ Thread.currentThread().getName());
byte[] b = new byte[1024 * 1024 * 1];
list.add(b);
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
// 线程二
new Thread(() -> {
int i = 0;
while (true) {
System.out.println(new Date().toString() + " " + i++ + " " + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
运行时设置的环境参数:-Xms16M -Xmx32m
运行结果:
运行时jvm的运行时数据区域截图:工具 jvisualvm
在old的空间瞬间下去的时候,就是一个线程因oom而gg的时候。
在一个线程gg之后,堆的使用里面就降低了,当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行!因为发生OOM之前要进行gc。