Не может закончить 2 542 Потока в Java на iMac на 4 ГБ OSX 10.6.3 Snow Leopard (32 бита)

Я запускаю следующую программу, пытающуюся выяснять, как настроить мою 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.

9
задан 30 June 2015 в 16:50
поделиться

4 ответа

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.

12
ответ дан 4 December 2019 в 15:12
поделиться

Вам необходимо выяснить максимальное количество потоков, поддерживаемых операционной системой в вашей системе.

В linux вы можете сделать что-то вроде:

cat /proc/sys/kernel/threads-max

, чтобы получить максимум, и чтобы установить его, вы можете сделать что-то вроде:

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

Также попробуйте запустить с:

-XX:-UseBoundThreads

и сообщить о результатах.

0
ответ дан 4 December 2019 в 15:12
поделиться

Согласно документу Apple Developer размер стека потоков должен быть не менее 64 КБ, поэтому ваш -Xss 1014 игнорируется. Но даже при 64 КБ на поток потребление памяти стека потоков составляет всего около 160 МБ, так что это не должно быть проблемой. Потоки также могут потреблять память из более ограниченного пула, или может быть просто ограничение на количество потоков, которое вы можете иметь для каждого процесса или пользователя.

1
ответ дан 4 December 2019 в 15:12
поделиться

Вы думаете, что у вас будет столько потоков одновременно до 1 часа? Я так не думаю. Я работал в приложении, которое обрабатывало сотни документов, конвертировало их из разных форматов, генерировало соответствующие логи в DB и хранило специфическую информацию. Тогда это тоже завершалось за секунды.

Единственное, о чем вам следует позаботиться, - это грамотный код, чтобы не создавать слишком много потоков. Вместо этого используйте ThreadPool, предоставляемый Java, чтобы одни и те же потоки могли быть использованы при необходимости. это обеспечит лучшую производительность. Также сохраняйте синхронизацию на минимальных блоках, чтобы избежать "бутылочных горлышек" при выполнении.

спасибо.

0
ответ дан 4 December 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: