OS X每个进程的Java最大线程数

6
运行这段代码。
        for (int i = 0; i < 4000; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(60000);
                    } catch (InterruptedException e) {
                    }
                }
            }).start();
            System.out.println(i);
        }

导致
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:658)
    at com.codeoverdrive.burnbearburn.Main.main(Main.java:10)

2024年后运行线程。 调整JVM堆和栈的大小并不能帮助解决问题。

sysctl kern.num_threads

返回结果

kern.num_threads: 10240

OS X Mountain Lion 10.8.4,搭载4GB内存的Macbook Air。

您有什么建议吗?


1
顺便提一下,你可以使用 TimeUnit.MINUTES.sleep(1); - fge
@fge 增加PermGen大小并不能帮助,因为它用于类定义和相关元数据。 - mixel
1个回答

3
最有可能的原因是您正在运行的用户对其可以创建的线程数量有限制。
尝试增加此限制。当前限制可以通过ulimit -u命令显示。请注意,作为普通用户,您可能无法增加它,您需要以root身份修改环境。
是的,在这种情况下,OutOfMemoryError是具有误导性的。

ulimit -u 显示的是最大用户进程数,而不是线程数。我不知道为什么,但设置它并不会改变它的值。 - mixel
它还会影响线程的数量!至少在Linux上是这样的。是的,作为用户无法更改它是正常的。 - fge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接