在4GB Mac OS X 10.6.3 Snow Leopard(32位)上无法通过Java获取2542个线程

时间:2010-05-18 20:29:28

标签: 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

无论我通过什么,我得到相同的结果,内存错误在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上遇到这个任意限制。

4 个答案:

答案 0 :(得分:11)

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中进行调整。

答案 1 :(得分:1)

根据Apple Developer doc,线程堆栈大小应至少为64K,因此忽略-Xss 1014。但即使每个线程64K,线程堆栈内存消耗也只有160MB左右,所以这应该不是问题。线程也可以从更有限的池中消耗内存,或者可以简单地限制每个进程或用户可以拥有的线程数。

答案 2 :(得分:0)

您需要找出操作系统在系统上支持的最大线程数。

在Linux上,您可以执行以下操作:

cat /proc/sys/kernel/threads-max

获得最大值,并设置它可以执行以下操作:

echo 10000 > /proc/sys/kernel/threads-max

也可以尝试使用:

-XX:-UseBoundThreads

并报告结果。

答案 3 :(得分:0)

您是否认为您将同时拥有这么多线程长达1小时?我不这么认为。我曾在应用程序中工作,处理过数百个文档,将它们转换为差异。格式,在DB中生成适当的日志并存储特定信息。然后它也在几秒钟内完成。

你应该注意的事情,明智地编码以避免产生过多的线程。而是使用Java提供的ThreadPool,以便在需要时可以使用相同的线程。这将提供更好的性能。同时保持最小块的同步,以避免执行中的瓶颈。

感谢。