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

我正在运行下面的程序,试图找出如何configuration我的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的function,因为我得到这些out of memory can't create native threads非常低的数量的out of memory can't create native threads ,如几百。 我需要看看什么特定的盒子能够用不同的-Xss参数,然后我在OSX上运行这个任意的限制。

Solutions Collecting From Web of "在4GB iMac OSX 10.6.3 Snow Leopard(32位)上无法通过2542个Java线程"

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

根据苹果开发人员文档线程堆栈大小应该至少64K,所以你的-XSS 1014被忽略。 但即使每线程64K,线程堆栈内存消耗只有约160MB,所以这不应该是问题。 线程也可能会消耗更多的内存,或者可能会限制每个进程或用户所拥有的线程数量。

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

在Linux上,你可以做一些事情:

 cat /proc/sys/kernel/threads-max 

获得最大值,并设置它,你可以做这样的事情:

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

另外尝试运行:

 -XX:-UseBoundThreads 

并报告结果。

你觉得你会有这么多线程同时长达1小时? 我不这么认为。 我曾经在处理数百个文档的应用程序中,将它们从diff和diff中转换出来。 格式,在DB中生成适当的日志,并存储特定的信息。 然后它也在几秒钟内完成。

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

谢谢。