回复“PDF”获取独家整理的学习资料!
来源:
http://sina.lt/gqaM
最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”
我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。
由于题目中给出的OOM,java中OOM又分很多类型;比如:堆溢出(“java.lang.OutOfMemoryError: Java heap space”)、永久带溢出(“java.lang.OutOfMemoryError:Permgen space”)、不能创建线程(“java.lang.OutOfMemoryError:Unable to create new native thread”)等很多种情况。
本文主要是分析堆溢出对应用带来的影响。
先说一下答案,答案是还能运行
。
代码如下:
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();
}
}
结果展示:
Wed Nov 07 14:42:18 CST 2018Thread[Thread-1,5,main]==
Wed Nov 07 14:42:18 CST 2018Thread[Thread-0,5,main]==
Wed Nov 07 14:42:19 CST 2018Thread[Thread-1,5,main]==
Wed Nov 07 14:42:19 CST 2018Thread[Thread-0,5,main]==
Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
at com.gosaint.util.JvmThread.lambda$main$0(JvmThread.java:21)
at com.gosaint.util.JvmThread$$Lambda$1/521645586.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
Wed Nov 07 14:42:20 CST 2018Thread[Thread-1,5,main]==
Wed Nov 07 14:42:21 CST 2018Thread[Thread-1,5,main]==
Wed Nov 07 14:42:22 CST 2018Thread[Thread-1,5,main]==