Я запускаю следующую программу, пытающуюся выяснять, как настроить мою JVM для получения максимального количества потоков, которые может поддерживать моя машина. Для тех, которые не могли бы знать, поставки Snow Leopard с Java 6.
Я пытался запустить его со значений по умолчанию и следующих командных строк, я всегда получаю Из Ошибки памяти в Thread 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
независимо от того, что я передаю его, я получаю те же результаты Из Ошибки памяти в 2 542
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.
Я закрыл все программы, кроме одного окна терминала, из которого запускал свой тест, и я добрался до 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.
Вам необходимо выяснить максимальное количество потоков, поддерживаемых операционной системой в вашей системе.
В linux вы можете сделать что-то вроде:
cat /proc/sys/kernel/threads-max
, чтобы получить максимум, и чтобы установить его, вы можете сделать что-то вроде:
echo 10000 > /proc/sys/kernel/threads-max
Также попробуйте запустить с:
-XX:-UseBoundThreads
и сообщить о результатах.
Согласно документу Apple Developer размер стека потоков должен быть не менее 64 КБ, поэтому ваш -Xss 1014 игнорируется. Но даже при 64 КБ на поток потребление памяти стека потоков составляет всего около 160 МБ, так что это не должно быть проблемой. Потоки также могут потреблять память из более ограниченного пула, или может быть просто ограничение на количество потоков, которое вы можете иметь для каждого процесса или пользователя.
Вы думаете, что у вас будет столько потоков одновременно до 1 часа? Я так не думаю. Я работал в приложении, которое обрабатывало сотни документов, конвертировало их из разных форматов, генерировало соответствующие логи в DB и хранило специфическую информацию. Тогда это тоже завершалось за секунды.
Единственное, о чем вам следует позаботиться, - это грамотный код, чтобы не создавать слишком много потоков. Вместо этого используйте ThreadPool
, предоставляемый Java, чтобы одни и те же потоки могли быть использованы при необходимости. это обеспечит лучшую производительность. Также сохраняйте синхронизацию на минимальных блоках, чтобы избежать "бутылочных горлышек" при выполнении.
спасибо.