当前位置:首页 > 操作系统 > MacOs

在4GB iMac OSX 10.6.3 Snow Leopard(32位)上无法通过Java获取2542个Threads

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

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

<code>java TestThreadStackSizes 100000
java -Xss1024 TestThreadStackSizes 100000
java -Xmx128m -Xss1024 TestThreadStackSizes 100000
java -Xmx2048m -Xss1024 TestThreadStackSizes 100000
java -Xmx2048m -Xms2048m -Xss1024 TestThreadStackSizes 100000
</code>

无论我通过什么,我得到相同的结果,在2542年内存不足错误

<code>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 sleepn", this.i);
                Thread.sleep(1000 * 60 * 60);
            }
            catch (final InterruptedException e)
            {
                throw new RuntimeException(e);
            }
        }
    }
}
</code>

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

我编写了这个程序来弄清楚Windows Server 2003能够做什么,因为我得到这些内存不能创建非常低数量的本机线程,比如几百个.我需要看看特定的盒子能用不同的-Xss参数,然后我在OSX上遇到这个任意限制.

解决方法:

2542似乎是一个任意数字:

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

要获得OSX 10.6.3的线程数,您需要:

<code>> sysctl kern.num_threads
kern.num_threads: 2560
</code>

<code>> sysctl kern.num_taskthreads
kern.num_taskthreads: 2560
</code>

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


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐