发布网友 发布时间:2022-11-12 15:29
共1个回答
热心网友 时间:2023-08-29 14:13
参考文章: JVM OOM异常会导致JVM退出吗?
结论是:OOM是针对线程的,哪个线程OOM了,JVM是释放掉该线程所有的资源。然后其他线程继续运行,JVM不会退出。
JVM退出的条件是:虚拟机内不存在非守护线程。
下面是我的demo测试:
运行的结果如下:
上面从日志打印来验证的。我们来从JVM的gc看:
这个图执行的时间有点久,所以你可以看到最后main thread在执行的时候,old几乎为空。这个不用管,重点看下红色框框的内容。
在第一个红色框,old满的之后,立即清理掉t1所占空间,以让t2继续执行。然后t2继续填满t1释放的内存后,它自己也OOM了。JVM释放t2所占内存,那就几乎是所有空间了。所以,main线程运行的时候old几乎为空。
PS:查看上图的gc用jvisualvm,但是需要给它安装个插件Visual GC。
安装插件文档: https://pan.baidu.com/s/19IeeGQnKcYEVpOqJtRsd_w