Я запускаю следующую программу, пытаясь выяснить, как настроить мою JVM для получения максимального количества потоков, которые моя машина может поддерживать. Для тех, кто может не знать, Snow Leopard поставляется с Java 6.
Я попытался запустить его с настройками по умолчанию и следующими командами, я всегда получаю ошибку Out of Memory в потоке 2542 независимо от того, какие параметры JVM установлены.
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.