Я могу совершенно неправильно сформулировать заголовок этого вопроса, поэтому, возможно, лучше начать с наблюдаемого поведения.
Я установил ограничение PID, используя docker-compose 120 PIDS для образа на основе Java. Если быть точным adoptopenjdk/openjdk11:jdk-11.0.2.9-alpine-slim
120 было немного произвольным, поскольку все, что я сделал, это использовал docker stats
для просмотра 20 бегущих изображений и отметив, что в то время все они имели счетчики PID ‹100, и я дал еще 20 в качестве запаса.
С тех пор я наблюдал некоторое поведение, когда возникают такие ошибки:
вызвано: java.lang.OutOfMemoryError: невозможно создать собственный поток: возможно, не хватает памяти или достигнуты ограничения процесса/ресурса
и docker stats
показывает использование памяти около 80%, например:
301,8 МБ / 376 МБ, используется 80,26% памяти
но главное 120 pids.
Мне сейчас интересно несколько вещей:
- я только что установил 120 слишком низко, и если да, то что разумно - может сильно зависеть от моего конкретного варианта использования, такого как размеры пула потоков, одновременные запросы и активность GC и т. д. Но если это так, то как лучше всего измерить - возможно измеряйте активность PIDS в течение недели или двух и устанавливайте уровень чуть выше максимального.
- Знает ли JVM об ограничении PIDS, которое применяется в настоящее время, может ли эргономика виртуальной машины даже обнаружить это ограничение и узнать, способна ли виртуальная машина создавать больше потоков или существуют флаги, которые могли бы сообщить об этом. Если он даже может это сделать, изменит ли это что-нибудь фундаментально, например. VM будет более консервативен в отношении количества потоков, которые он пытается начать делать, например, GC или JIT или внутреннюю уборку?