我正在运行以下程序,试图弄清楚如何配置我的 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
数字与 2542
和 2545
匹配,因为后台显然有其他线程在运行。
根据官方文档 kern.num_taskthreads
在桌面版 OSX 中无法调整。
关于java - 在 4GB iMac OSX 10.6.3 Snow Leopard(32 位)上无法通过 Java 中的 2542 个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2860889/