В идеале вы можете использовать профилировщик, чтобы отследить проблему. Если вы не можете использовать профилировщик в среде, в которой он находится (например, в рабочей среде), попробуйте воспроизвести его где-нибудь еще и прикрепить там профилировщик. Хотя часто это может быть сложно, поэтому вот трюк, который я использовал несколько раз, чтобы найти причину использования ЦП в рабочей среде из командной строки:
watch -n1 'jstack [pid] | grep -A 1 RUNNABLE | grep -v RUNNABLE | grep -v \\-\\- | grep -v socketRead0 | grep -v socketAccept`
Если вы посмотрите это в течение короткого периода времени, вы можете увидеть некоторые общие методы, вызываемые. Затем захватите полный вывод jstack в файл:
jstack [pid] > jstack.log
Теперь найдите в файле один из методов, которые вы часто видели. Из его трассировки стека обычно можно найти код, отвечающий за перемалывание процессора. Если ничего не появляется, возможно, ваше время уходит на чрезмерную сборку мусора, и вам просто нужно увеличить память. Вы можете использовать:
`jmap -heap [pid]`
Чтобы получить лучшее представление об использовании памяти. А еще лучше, вы можете прикрепить jvisualvm или коммерческий профилировщик (например, YourKit ), чтобы увидеть его графически с течением времени. Я также иногда использовал watch -n1 'jmap -heap [pid]'
.