Как найти класс, насыщенный процессорами, в Java?

У меня есть большая программа на Java, которая использует многопоточность. В некоторых случаях программа начинает использовать 100% трех ядер моей восьмиядерной системы. При нормальном использовании программа использует все ядра на 1-2%. Как я могу найти класс, который перегружает ядра?

Ответы

Ответ 1

Используйте профайлер, такой как jvisualvm, который связан с jdk-1.6.0_10

Ответ 2

Лучшее решение - использовать профилировщик - то, для чего они созданы, и там отличный набор с Java 6.

Другим (далеким от идеала решением) является запуск вашей программы в Eclipse IDE (если это то, что вы используете) в режиме отладки. Затем вы можете посмотреть текущие потоки. ЕСЛИ многие из них приостановлены, тот, который не может быть вашим преступником. Заставьте его сломаться (с панели инструментов), и вы можете увидеть, где он находится. Есть много шансов, что вы найдете четкий цикл или ожидание.

Ответ 3

Используйте профилировщик, чтобы выяснить, какой поток использует все ваши циклы процессора, и метод (ы), которые они выполняют.

Ответ 5

Если вы отправляетесь в коммерческий маршрут профайлера, я бы рекомендовал использовать Dynatrace.

Ответ 6

Попробуйте взять дамп потоков (см. команды jps, jstack), а затем посмотрите, какие методы выполняются.

Ответ 7

Если вы используете Java над UNIX или некоторые версии Linux, посмотрите в DTrace с Java.