java - 在 4GB iMac OSX 10.6.3 Snow Leopard(32 位)上无法通过 Java 中的 2542 个线程

标签 java windows multithreading macos memory

我正在运行以下程序,试图弄清楚如何配置我的 JVM 以获得我的机器可以支持的最大线程数。对于那些可能不知道的人,Snow Leopard 附带 Java 6。

我尝试使用默认值和以下命令行启动它,无论 JVM 选项设置为什么,我总是在线程 2542 处遇到内存不足错误。

java TestThreadStackSizes 100000
java -Xss1024 TestThreadStackSizes 100000
java -Xmx128m -Xss1024 TestThreadStackSizes 100000
java -Xmx2048m -Xss1024 TestThreadStackSizes 100000
java -Xmx2048m -Xms2048m -Xss1024 TestThreadStackSizes 100000

无论我通过什么,我都会得到相同的结果,Out of Memory Error at 2542

public class TestThreadStackSizes
{
    public static void main(final String[] args)
    {
        Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            public void uncaughtException(final Thread t, final Throwable e)
            {
                System.err.println(e.getMessage());
                System.exit(1);
            }
        });
        int numThreads = 1000;
        if (args.length == 1)
        {
            numThreads = Integer.parseInt(args[0]);
        }

        for (int i = 0; i < numThreads; i++)
        {
            try
            {
                Thread t = new Thread(new SleeperThread(i));
                t.start();
            }
            catch (final OutOfMemoryError e)
            {
                throw new RuntimeException(String.format("Out of Memory Error on Thread %d", i), e);
            }
        }
    }

    private static class SleeperThread implements Runnable
    {
        private final int i;

        private SleeperThread(final int i)
        {
            this.i = i;
        }

        public void run()
        {
            try
            {
                System.out.format("Thread %d about to sleep\n", this.i);
                Thread.sleep(1000 * 60 * 60);
            }
            catch (final InterruptedException e)
            {
                throw new RuntimeException(e);
            }
        }
    }
}

关于如何影响这些结果的任何想法?

我编写这个程序是为了弄清楚 Windows Server 2003 的能力,因为我发现这些 out of memory can't create native threads 的数量非常少,比如几百个.我需要看看一个特定的盒子能用不同的 -Xss 参数做什么,然后我在 OSX 上遇到了这个任意限制。

最佳答案

2542 似乎是一个任意数字:

我关闭了所有程序,除了我运行测试的一个终端窗口,我到达 2545,告诉我这是一个任意限制。

要获取 OSX 10.6.3 的线程数,请执行以下操作:

> sysctl kern.num_threads
kern.num_threads: 2560

> sysctl kern.num_taskthreads
kern.num_taskthreads: 2560

2560 数字与 25422545 匹配,因为后台显然有其他线程在运行。 根据官方文档 kern.num_taskthreads 在桌面版 OSX 中无法调整。

关于java - 在 4GB iMac OSX 10.6.3 Snow Leopard(32 位)上无法通过 Java 中的 2542 个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2860889/

相关文章:

java - entitymanager.find 使用外键的主键执行查找查询

java - Whitelabel错误页面而不是特定的jsp页面

c++ - boost::regex 库中的内存泄漏

datetime.now() 的 Python 解析

.net - 如何获取调度程序的 TaskScheduler?

python - 在后台运行类函数并检索其状态

ios - applicationDidBecomeActive 是否 : block the main thread?

java - 在 Windows 上打开 git bash 并在 java 中运行命令

Java 货币面额舍入问题

.net - BeginInvoke-EndInvoke问题