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