Мы широко используем Java ThreadPoolExecutor. В частности, мы следуем шаблону объединения fork, создавая список вызываемых вызовов и используя для них временный вариант invokeAll(). Мы используем только эти пулы потоков для выполнения операций ввода-вывода (без процессора), однако, глядя на дамп потока, мы видим, что эти конкретные потоки потребляют высокий процессор. Глядя на реализацию FutureTask.awaitDone(), я вижу, что в LockSupport.parkNanos() реализована стратегия занятости и ожидания с чередованием вызовов. Глядя на JavaDoc для самого parkNanos, я вижу, что этот комментарий «может возвращаться ложно ..», что заставляет меня задаться вопросом, вращается ли awaitDone() и в свою очередь вызывает высокий уровень ЦП. Любая помощь будет оценена!Значения CPU для FutureTask.awaitDone
ответ
Я вижу этот комментарий "может вернуться поддельно .."
То же самое верно и для ReentrantLock
и Condition#await
. Одной из причин, по которым вы обычно связываете await
или wait
с петлей while, является из-за ложной природы подвески нити. Тем не менее, поскольку мы не беспокоимся о побочном пробуждении с Condition
, вы также не должны беспокоиться об этом.
Это действительно вращение, но оно не занято. Первая петля обычно быстро сопровождается подвеской.
Я думаю, что awaitDone не «занят - подожди», потому что он вызывает parkNanos. parkNanos концептуально похож на Object.wait(): поток ожидает, но CPU может делать другие вещи тем временем. Бесконечный цикл существует из-за ложных пробуждений, но это проблема ОС, и они также не подразумевают ожидание оживленного ожидания.
Поток может потратить много времени на метод («настенные часы»), но это не обязательно время процессора. Моя рекомендация - использовать профилировщик, потому что они могут сделать это различие, и они могут помочь вам найти реальное узкое место процессора.
Похожие вопросы:
What specifically are wall-clock-time, user-cpu-time, and system-cpu-time in UNIX?
How can I Monitor cpu usage per thread of a java application in a linux multiprocessor environment?
- 1. как работает функция FutureTask.awaitdone()?
- 2. Сценарий для мониторинга CPU
- 3. Как получить значения «CPU Ready» для гостя KVM?
- 4. Получить значения CPU WMI с помощью Perl
- 5. CPU
- 6. CPU Features.GetCount возвращают неправильный номер для сердечников CPU
- 7. Докеры cpu share и garant Минимальный выделенный CPU для контейнера
- 8. Android Renderscript для вычисления CPU
- 9. Утилита Windows для потребления CPU
- 10. Эффективное кодирование для низкоуровневого CPU
- 11. Приложение для Android || Исследование CPU
- 12. Скомпилировать код cuda для CPU
- 13. Архитектуры ARM для Android CPU
- 14. Память CPU для каждой программы
- 15. Регистр CPU для миграции ядра
- 16. Для Loop High CSRSS CPU
- 17. Связь между процессами Linux cpu-to-cpu
- 18. Kernel panic, CPU stucked, CPU stalled
- 19. python multiprocessing, cpu-s и cpu core
- 20. CPU Affinity
- 21. Максимальное использование CPU (максимально допустимый использование CPU)
- 22. Производительность CPU
- 23. Azure Websites CPU%
- 24. l2 cache CPU сравнения
- 25. Регистры CPU и многозадачность
- 26. Вычислить CPU за процесс
- 27. 128x128 бит умножение для x86 CPU
- 28. Использование CPU Dstat для одного конкретного процесса
- 29. CPU и Memory Cap для AppDomain
- 30. WebGL CPU против GPU для преобразований
ли вы проверить активность процессора с профайлер? – lbalazscs
Я плетю выходы jstack и top, используя этот метод, описанный здесь, чтобы найти соответствующие темы. http://www.boxjar.com/using-top-and-jstack-to-find-the-java-thread-that-is-hogging-the-cpu/ – RPJ
Профилировщик предоставляет подробную информацию о режиме, а не только thread использует процессор, но также и тот метод. Существуют бесплатные профили Java, такие как VisualVm и «Java Mission Control». – lbalazscs