您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
一个java进程发生了OOM后,该进程或服务一定会被杀死吗?
线程,内存,程序一个java进程发生了OOM后,该进程或服务一定会被杀死吗?
发布时间:2016-12-08加入收藏来源:互联网点击:
一个java进程发生了OOM后,该进程或服务一定会被杀死吗?
回答于 2019-09-11 08:43:50
回答于 2019-09-11 08:43:50
不一定。
一个线程 OOM 后,其他线程是可以正常运行的,但是内存泄露之后可能会导致整个程序内存溢出,最终程序不可用。
那么我们下面说一下,一个线程 OOM 了,为什么其他线程不受影响呢?
要回答这个问题,我们先来回想一下 java 的内存结构。如下图所示:
我们知道,多线程的时候,每个线程都拥有一个栈和一个程序计数器。栈和程序计数器用来保存线程的执行历史和线程的执行状态,是线程私有的资源。堆是线程共享的,所以理论上一个线程 OOM 了,其他线程应该受影响才对啊,实际上却并不是,这是什么原因呢?
有兴趣的可以按照我下面的这段代码自己去跑一下,测试一下这个内存溢出。
然后结合 JvisualVM 工具,你会看到,在程序内存溢出之后,溢出的内存的线程所占的内存会被快速释放。如下图所示
根据上图,我们可以得出当一个线程抛出 OOM 异常后,它所占据的内存资源会被快速的释放掉,从而不会影响其他线程的运行!
另外当一个线程 OutOfMemoryError 后,如果这个 OutOfMemoryError 被捕获,那么 catch 之后吞掉的话程序还能试着继续运行。发生 OutOfMemoryError 之后,只是当前这个线程申请更多的内存的时候不被 JVM 允许,所以会抛出 OutOfMemoryError 异常。当抛出 OutOfMemoryError 异常后,当前这个线程会被退出,它所占的内存会被 JVM 清理掉。
那么 JVM 为什么要这么设计呢?
答案是,Java 程序通常不是为了适应意外的异常而设计的,OOM 之后可能导致应用状态不一致,建议最好重启。
回答于 2019-09-11 08:43:50
不一定。有的oom,java进程会退出,有时不会,进程还在,但是请求无法响应。
上一篇:现在感觉活着很累,工作也不顺利,该怎样鼓励自己呢?迷茫ing?
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |