Максимальное количество ниток в linux - PullRequest
2 голосов
/ 13 июля 2020

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

import java.util.concurrent.atomic.AtomicInteger;

public class TestThread extends Thread {
    private static final AtomicInteger count = new AtomicInteger();

    public static void main(String[] args) {
        try{
            while (true) {
                (new TestThread()).start();
            }
        } catch (Error | Exception e) {
            System.out.println(e.getMessage());
        }
    }

    @Override
    public void run() {
        System.out.println(count.incrementAndGet());
        while (true)
            try {
                Thread.sleep(Integer.MAX_VALUE);
            } catch (InterruptedException e) {
                break;
            }
    }
}

ОС - ubuntu: 18.04, память - 4G, количество процессоров - 2. JDK: openjdk1. 8.0_252

java -Xss1m -Xms1024m -Xmx1023m TestThread

java -Xss512k -Xms1024m -Xmx1023m TestThread

java -Xss1m -Xms2048m -Xmx2048m TestThread

В результате количество потоков всегда равно примерно 10000-му.

  1. почему результат такой же.
  2. Я установил -Xss1m в команде, означает ли это, что каждый поток будет иметь только 1 м памяти? если у него одна память, 10000-й поток будет иметь память 10 ГБ, на самом деле в машине только память 4G.

1 Ответ

5 голосов
/ 13 июля 2020

-Xss определяет максимальный размер стека для Java потоков. Когда поток запускается, операционная система создает область виртуальной памяти для стека этого размера, но память не выделяется сразу в физической ОЗУ.

Физические страницы распределяются лениво при первом доступе к памяти к страница. Пока ваши потоки не вызывают глубокие методы, они не используют все пространство стека. Вот почему только несколько нижних страниц стека выделяются в ОЗУ, независимо от того, что установлено -Xss.

Linux включает переопределение памяти по умолчанию. Это означает, что он позволяет выделять больше виртуальной памяти, чем объем физической ОЗУ (если эта виртуальная память фактически не поддерживается физическими страницами, как в вашем случае).

Итак, в вашем случае OutOfMemoryError выбрасывается не из-за места в стеке, а из-за одного из других ограничений ОС:

  • ulimit -u
  • sysctl kernel.pid_max
  • sysctl kernel.threads-max

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...