首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个进程有3个线程,如果一个线程抛出oom,其他两个线程还能运行么?

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

作者头像
王小明_HIT
发布2019-08-13 11:30:17
5680
发布2019-08-13 11:30:17
举报

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

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工具进行分析

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

给出测试代码:

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(); } }

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员奇点 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档