JVM堆内存OOM后其他线程是否还可以正常运行

Posted enhance

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM堆内存OOM后其他线程是否还可以正常运行相关的知识,希望对你有一定的参考价值。

可以的,当一个线程出现OOM后,他占用内存资源会立马释放掉

public class JvmThread 

    public static void main(String[] args) 
        new Thread(() -> 
            List<byte[]> list = new ArrayList<byte[]>();
            while (true) 
                System.out.println(new Date().toString() + Thread.currentThread() + "==");
                byte[] b = new byte[1024 * 1024 * 1];
                list.add(b);
                try 
                    Thread.sleep(1000);
                 catch (Exception e) 
                    e.printStackTrace();
                
            
        ).start();

        // 线程二
        new Thread(() -> 
            while (true) 
                System.out.println(new Date().toString() + Thread.currentThread() + "==");
                try 
                    Thread.sleep(1000);
                 catch (Exception e) 
                    e.printStackTrace();
                
            
        ).start();
    

 

技术图片

。我们仔细观察一下在14:42:05~14:42:25之间曲线变化,你会发现使用堆的数量,突然间急剧下滑!这代表这一点,当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行!

 

以上是关于JVM堆内存OOM后其他线程是否还可以正常运行的主要内容,如果未能解决你的问题,请参考以下文章

某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

面试官:当你的JVM 堆内存溢出后,其他线程是否可继续工作?

美团面试题:一个线程 OOM 后,其他线程还能运行吗?

5.JVM系列-堆内内存泄露案例分析解决

一个线程oom,进程里其他线程还能运行吗?

JVM内存溢出后服务还能运行吗