Подтвердить что ты не робот

Почему максимальное количество потоков уменьшается, когда я увеличиваю максимальный размер кучи?

В этом тесте показано максимальное количество потоков, которые могут быть созданы в Java

    System.out.println("Max memory  " + Runtime.getRuntime().maxMemory() / 1024 / 1024 + "M");
    for (int i = 0;; i++) {
        Thread t = new Thread() {
            public void run() {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                }
            };
        };
        try {
            t.start();
        } catch (Error e) {
            System.out.println("Max threads " + i);
            e.printStackTrace();
            System.exit(1);
        }
    }

Когда я запускаю его с размером кучи по умолчанию (256 М), я получаю

Max memory  247M
Max threads 2247
java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:691)
    at test.Test1.main(Test1.java:19)

когда я увеличиваю максимальный размер кучи до 512 М, я получаю

Max memory  494M
Max threads 1906
...

когда я увеличиваю максимальный размер кучи до 1024 М, я получаю

Max memory  989M
Max threads 1162
...

То есть, больше кучи памяти меньше потоков. Почему это?

4b9b3361

Ответ 1

Для каждого потока требуется стек. Чем больше памяти выделяется куче, тем меньше памяти остается для стеков.

Это будет особенно остро, если вы используете 32-битную JVM, поскольку для всего процесса будет не более 4 ГБ адресного пространства (код, куча, стеки и т.д.). Я не могу воспроизвести это поведение в своем 64-битном поле, где "Максимальные потоки" остаются неизменными независимо от того, сколько памяти я выделяю куче.

Стоит отметить, что многие операционные системы позволяют настраивать размер стека. В Unix это делается с помощью ulimit -s.

Ответ 2

Я предполагаю, что увеличение размера кучи (и использование всего этого) снижает объем памяти, доступный ОС для создания новых потоков, поэтому он не может создавать столько потоков, сколько было раньше.