Обычно это проблема с высокой загрузкой процессора.
Существует два вида проблем с центральным процессором
a) Где в потоке используется 100% CPU одного ядра (это ваш сценарий)
b) Использование ЦП «ненормально высоко», когда мы выполняем определенные действия. В таких случаях процессор не может быть 100%, но будет чрезмерно высоким. Обычно это происходит, когда в коде выполняются интенсивные операции с процессором, такие как синтаксический анализ XML, десериализация сериализации и т. Д.
Случай (а) легко анализировать. Когда вы испытываете 100% CPU 5-6 дампов с интервалом в 30 секунд. Ищите поток, который является активным (в состоянии «runnable») и который находится внутри того же метода (вы можете сделать это, контролируя стек потоков). Скорее всего, вы увидите «занятое ожидание» (см. Пример ниже)
while(true){
if(status) break;
// Thread.sleep(60000); // such a statement would have avoided busy wait
}
Случай (b) также может быть проанализирован с использованием дампов потоков, взятых с равным интервалом. Если вам повезет, вы сможете узнать код проблемы, если вы не сможете определить код проблемы с помощью дампа потока. Вам нужно прибегнуть к профилировщикам. По моему опыту, профилировщик YourKit очень хорош.
Я всегда сначала пробую с дампами потоков. Профилировщики будут только последним средством. В 80% случаев мы сможем идентифицировать, используя дампы потоков.