Блокировка Блокировки появляются в коде
Я исследую текущую проблему использования процессора, где она становится высокой после некоторого времени использования. Я получил предупреждение на одном из узлов, что нагрузка была высокой, и я открыл Java Mission Control и быстро записал полет.
Я прилагаю вывод того, что я вижу. Я не разработчик, поэтому мне нужна помощь, чтобы понять, что я вижу.
Я смотрю на блокировки потоков и вижу, что 3 потока заблокированы. Я открыл трассировку стека и вижу количество записей Request/Response, Socket и т. Д.
Есть идеи, что это значит?
2 ответа
Изображение, которое вы показали, показывает не три заблокированных потока, а три объекта, которые являются наиболее спорными блокировками. Общее удобное для разработчиков описание того, что означают части на странице, которую вы просматриваете, см. В документе на этой странице.
Теперь, так как вы сказали, что вы не разработчик, позвольте мне немного рассказать вам об этом:
Что значит для объекта быть замком?
Это Java-вещь. Java установила схему блокировки многопоточности, основанную на концепции мониторов. В принципе, любой объект в языке может быть использован в качестве блокировки, чтобы когда поток выполнял код наподобие:
synchronized(myObject){
//code
}
в то время как //code
выполняется, никакой другой поток не может быть выполнен //other code
в блоке вроде:
synchronized(myObject){
//other code
}
(при условии, что myObject каждый раз ссылается на один и тот же фактический объект).
Что означает, что блокировка может быть оспорена?
Предположим, что поток A в настоящее время выполняется //code
из примера выше (предположим, что это занимает некоторое ненулевое время), и поток B достигает точки, где он хочет попытаться выполнить //other code
, Поскольку язык настроен так, что эти две части кода не могут быть выполнены одновременно (так называемое взаимное исключение, поток b должен будет сидеть и ждать, пока не выполнится). //other code
до тех пор //code
закончен. Когда это происходит, мы говорим, что блокировка для myObject
утверждается
Какие 3 класса я вижу?
Это классы 3 объектов, действующих как блокировки, которые вызвали наибольшую задержку у потоков, ожидающих их.
Какую трассировку стека я вижу?
То есть трассировка стека до одной из точек, где один из потоков провел большую часть времени в ожидании.
И, возможно, вопрос, который вас больше всего волнует: указывает ли информация в этом профиле на проблему производительности?
Это зависит от того, как долго был принят ваш полетный отчет, но мое мнение (примите это с недоверием, учитывая, что я не знаю подробностей о вашем заявлении), может быть, довольно разочаровывающим , но не обязательно. Общее время ожидания наиболее предполагаемой блокировки составило чуть более 3 секунд, при этом среднее время ожидания составляло полторы секунды. Это может звучать не так уж много (и на самом деле может не быть много, если ожидание произошло в относительно неважном потоке), но для кода 1,5 секунды ожидания могут быть очень большими. Примите во внимание, что рекомендация для отзывчивости пользовательского интерфейса заключается в том, что операция должна занимать менее 0,1 секунды, чтобы пользователь не заметил, и менее 1 секунды, чтобы его ход мыслей не был прерван. Если ожидание этой блокировки произошло в потоке, управляющем вашим пользовательским интерфейсом, пользователь заметил бы задержку.
Моя лучшая рекомендация для вас, не являющегося разработчиком, - получить трассировку стека, которую вы получите, посмотрев java.lang.ref.ReferenceQueue$Lock
объект и отправить его разработчику вашего проекта для дальнейшего изучения.
Кроме того, вы упомянули, что проблема с загрузкой процессора вызвала это расследование, поэтому: будут ли конфликты блокировок вызывать высокую загрузку процессора?
Нет. Когда утверждается блокировка, один или несколько потоков сидят и ждут, что означает, что они не будут использовать процессор. Фактически, один из признаков того, что конфликт блокировок может вызывать проблемы, заключается в том, что нагрузка на ваш процессор ненормально низкая (особенно на многоядерной машине). Вероятно, ваша высокая загрузка ЦП находится в другом месте, что можно найти в результатах профилирования. Чтобы исследовать высокую загрузку процессора, вы должны попробовать горячие точки метода или что-то вроде этого. Скорее всего, это будет чрезвычайно продуктивно, если у вас есть обученный разработчик, который смотрит на это с вами.
Как и многие программы, они тратят значительную часть своего времени на ведение журнала. В этом случае ваша программа тратит много времени на запись в свою консоль, которая, я думаю, перенаправляется в файл. Чем больше пишешь, тем больше времени занимает. особенно если ваша дисковая подсистема станет узким местом. Если журналы попадают куда-то на экран, они могут замедляться в зависимости от того, что делает этот компьютер.