这个问题的答案是 : 还能运行!
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(); } }