Взрыв пула потоков 😂

Java

Я наткнулся на несколько статей, в которых говорилосьРуководство по разработке Alibaba JAVA (нажмите, чтобы загрузить версию 1.4.0)Примечание об использовании пула потоков. В нем говорится об использовании связанных пулов потоков в проекте, что не допускаетсяExecutorsсоздавать. Реализация пулов потоков таким образом может вызвать некоторые проблемы.

Исходное изображение:

Поэтому малыш отказался признать поражение и хотел выяснить это (компьютер в офисе постоянно зависал... было очень интересно).

Исследование FixedThreadPool

Написала местному оFixedThreadPoolдемо, Конфигурация запуска проекта:-Xms64m -Xmx192m -Xss1024K -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m:

1. Сначала смотрим на память, ЦП и количество потоков, когда в начале запроса нет:

2. Затем запустить запрос (не имитировать все время внешний вызов, а прямо написать бесконечный цикл внутри для имитации бизнес-обработки):

3.MetaSpaceОбъем памяти почти не изменился, в основном вHeapв.CPUИ момент когда есть запрос в куче витает, время идет, звук радиатора компа все громче 😂. Наконец в консоли появляется то, что я хочу:

4."OOM"- То, что я хотел, пришло. внутриRMI TCP Connection(idle)Это проблема, когда я делаю дамп кучи.Мы можем видеть из файла, что состояние, соответствующее потоку, равноBLOCKED:

5. Заодно проверяем размер инстанса в текущем проекте:

Самый привлекательный "мальчик"-Node. Поскольку запросы продолжают поступать в программу, этоFixedThreadPoolРазмер по умолчаниюMAX_VALUE. Затем, когда количество потоков не может быть обработано, запрос будет помещен в коллекцию, и, наконец, текущий будет разорван.Heap. (Еще одно слово: Если это произойдет в мидл-офисном сервисе, то вам будет очень интересно 😂)

Исследование CachedThreadPool

Написала местному оCachedThreadPoolдемо, Конфигурация запуска проекта:-Xms64m -Xmx192m -Xss1024K -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m:

Мы не смотрели его, когда служба началась, как и выше. Смотрим прямо на запрос (взорвался моментально 💥💥, а потом компьютер перезагрузился 😑), очевидное - куча памяти и количество процессов.
Потом в консоли ошибка:
Это означает, что невозможно создать собственный поток уровня операционной системы (native thread) локально, а количество потоков, создаваемых программой, достигло верхнего предела. Тогда я могу только просмотреть дамп кучи до конца (если я подожду до конца, мой компьютер снова перезагрузится 😑).

Мы видим, что большинство созданных нами потоков находятся вTIMED_WAITINGВ этом состоянии блокируются все входящие, причина в особенности очереди текущего пула потоков.SynchronousQueueЭто специальный класс реализации очереди блокировки. На самом деле он не поддерживает ряд областей хранения для элементов. Он поддерживает набор потоков. При попытке вызвать метод добавления элементов другой поток должен попытаться извлечь эти элементы. , в противном случае элемент не может быть "добавлен" к нему.

Суммировать

Выше я выбрал пул потоков для обоих случаев, чтобы объяснить.На самом деле, основная цель здесь состоит в том, чтобы сообщить друзьям, что когда мы используем многопоточность в нашей программе, минимальное требование состоит в том, чтобы быть в состоянии понять описание параметры пула потоков, а затем в соответствии с бизнес-посещениями, чтобы примерно определить значение каждого параметра. Избегайте описанной выше ситуации! ! --- Возможно, то, что я сказал, недостаточно полно (пока в коллекции нет структуры данных), я надеюсь, что некоторые друзья прокомментируют и добавят ~