0
点赞
收藏
分享

微信扫一扫

一个进程有3个线程,如果一个线程抛出oom,其他两个线程还能运行么?

 

这个问题的答案是 : 还能运行!

JVM 分析工具

jvisualVM工具强大 相当于 jstack jmap 

也可以使用jstack pid 

jstat -gcutil  查看gc 情况

命令参考http://guafei.iteye.com/blog/1815222


生产的jvisualVM可能就不好用了,可以使用:

jmap -dump:live,format=b,file=m.hprof <PID>

导出dump文件,然后使用MAT工具进行分析


一个进程有3个线程,如果一个线程抛出oom,其他两个线程还能运行么?_分析工具



你会发现使用堆的数量,突然间急剧下滑!这代表着一点,当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行!

一个进程有3个线程,如果一个线程抛出oom,其他两个线程还能运行么?_分析工具_02


一个进程有3个线程,如果一个线程抛出oom,其他两个线程还能运行么?_ide_03






给出测试代码:



import java.util.ArrayList;

import java.util.Date;

import java.util.List;


public class JavaOOM4Thread {

    /**

     * 一个进程有3个线程,如果一个线程抛出oom,其他两个线程还能运行么? 答案是 还能运行 -Xms20m -Xmx20m

     * -XX:+HeapDumpOnOutOfMemoryError

     * @param args

     */

    public static void main(String[] args) {

        new Thread(new Runnable() {


            @Override

            public void run() {

                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 (InterruptedException e) {

                        e.printStackTrace();

                    }

                }

            }

        }).start();


        new Thread(new Runnable() {

            @Override

            public void run() {

                while (true) {

                    System.out.println(new Date().toString() + Thread.currentThread() + "==");

                    try {

                        Thread.sleep(1000);

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                }

            }

        }).start();

    }

}



举报

相关推荐

0 条评论