java - 为什么这个Java小程序会让MacOS重启?

标签 java multithreading macos operating-system

代码如下

Set<Thread> threads = new HashSet<>();

Runnable r = () -> {
    try {
        Thread.sleep(Long.MAX_VALUE);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
};

for (int i = 0; i < 20000; i++) {
    Thread t = new Thread(r);
    threads.add(t);
    t.start();
    if (i % 100 == 0) {
        System.out.println(i);
    }
    Thread.sleep(2);
}

执行时,我开始看到类似的值

0
100
200
300

正如预期的那样,直到我看到:

3900
4000
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:717)
    at App.main(scratch.java:24)
Java HotSpot(TM) 64-Bit Server VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminated

但不久之后(10 - 20 秒左右)MacOS 决定重新启动。我在这里看到的重启的原因是什么?主线程抛出异常,但有约 4000 个线程 hibernate 的进程导致......操作系统中的什么?这是内存溢出还是与操作系统的任务调度程序有关?

MacOS version: 10.14.3 (18D109)
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)

最佳答案

尽管控制台显示程序已完成,但 JVM 进程仍在运行,直到所有资源都被释放。同时,您的操作系统线程不足,速度慢且不稳定,这会导致所有进程滞后,包括 JVM 终结。作为自卫,操作系统触发内核 panic 。这就是您的 MacOS 重新启动的原因。

*OS - 操作系统

关于java - 为什么这个Java小程序会让MacOS重启?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54724363/

相关文章:

java - 不同日期加天数

java - 如何在 smack 中设置我的名字?

multithreading - 半异步代码逻辑

python - 如何在不同的Qt线程中调用GUI元素?

macos - 如何像 Finder 一样丢弃当前用户不拥有的项目?

java - 如何在 Eclipse RCP 应用程序中使 View 可滚动?

java - NoSuchMethodError 因为找到了错误的类

multithreading - Go运行时会创建操作系统线程(M)吗?

objective-c - 使用分割隔符样式时,NSSplitView 如何跟踪光标?

java - 如何在 Mac OS 上用 C++ 实现命名管道?