Я наткнулся на несколько статей, в которых говорилосьРуководство по разработке Alibaba JAVA (нажмите, чтобы загрузить версию 1.4.0)Примечание об использовании пула потоков. В нем говорится об использовании связанных пулов потоков в проекте, что не допускается
Executors
создавать. Реализация пулов потоков таким образом может вызвать некоторые проблемы.
Исходное изображение:
Поэтому малыш отказался признать поражение и хотел выяснить это (компьютер в офисе постоянно зависал... было очень интересно).
Исследование FixedThreadPool
Написала местному о
FixedThreadPool
демо, Конфигурация запуска проекта:-Xms64m -Xmx192m -Xss1024K -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m
:
2. Затем запустить запрос (не имитировать все время внешний вызов, а прямо написать бесконечный цикл внутри для имитации бизнес-обработки):
MetaSpace
Объем памяти почти не изменился, в основном вHeap
в.CPU
И момент когда есть запрос в куче витает, время идет, звук радиатора компа все громче 😂. Наконец в консоли появляется то, что я хочу:
4."OOM"
- То, что я хотел, пришло. внутриRMI TCP Connection(idle)
Это проблема, когда я делаю дамп кучи.Мы можем видеть из файла, что состояние, соответствующее потоку, равноBLOCKED
:
Самый привлекательный "мальчик"-
Node
. Поскольку запросы продолжают поступать в программу, этоFixedThreadPool
Размер по умолчаниюMAX_VALUE
. Затем, когда количество потоков не может быть обработано, запрос будет помещен в коллекцию, и, наконец, текущий будет разорван.Heap
. (Еще одно слово: Если это произойдет в мидл-офисном сервисе, то вам будет очень интересно 😂)
Исследование CachedThreadPool
Написала местному о
CachedThreadPool
демо, Конфигурация запуска проекта:-Xms64m -Xmx192m -Xss1024K -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m
:
Мы видим, что большинство созданных нами потоков находятся в
TIMED_WAITING
В этом состоянии блокируются все входящие, причина в особенности очереди текущего пула потоков.SynchronousQueue
Это специальный класс реализации очереди блокировки. На самом деле он не поддерживает ряд областей хранения для элементов. Он поддерживает набор потоков. При попытке вызвать метод добавления элементов другой поток должен попытаться извлечь эти элементы. , в противном случае элемент не может быть "добавлен" к нему.
Суммировать
Выше я выбрал пул потоков для обоих случаев, чтобы объяснить.На самом деле, основная цель здесь состоит в том, чтобы сообщить друзьям, что когда мы используем многопоточность в нашей программе, минимальное требование состоит в том, чтобы быть в состоянии понять описание параметры пула потоков, а затем в соответствии с бизнес-посещениями, чтобы примерно определить значение каждого параметра. Избегайте описанной выше ситуации! ! --- Возможно, то, что я сказал, недостаточно полно (пока в коллекции нет структуры данных), я надеюсь, что некоторые друзья прокомментируют и добавят ~