专栏名称: 石杉的架构笔记
专注原创、用心雕琢!十余年BAT一线大厂架构经验倾囊相授
目录
相关文章推荐
鼠绘情报站  ·  海贼王1140话详细情报丨夏姆洛克准备抓捕巨 ... ·  3 天前  
Kane的小K屋  ·  资本家最喜欢的15个“经济学武器库”! ·  3 天前  
51好读  ›  专栏  ›  石杉的架构笔记

某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

石杉的架构笔记  · 公众号  ·  · 2021-04-06 09:34

正文

点击上方蓝色“石杉的架构笔记”,选择“设为星标”

回复“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]==







请到「今天看啥」查看全文