Как проверить, какой поток держит монитор? - PullRequest
1 голос
/ 03 августа 2020

У меня проблема с производительностью (в сложном коде Scala с использованием параллельных коллекций и фьючерсов). Я использовал JFR для проверки более подробной информации, и я вижу, что проблема проявляется как поток, ожидающий объекта монитора (поток, кажется, ожидает в java.util.concurrent.ForkJoinTask#internalWait, вызывая метод wait из ForkJoinTask). Я хотел бы знать, какой поток содержит этот объект монитора (и из какой функции / стека вызовов был введен монитор). JFR показывает мне какой-то адрес для монитора, но я не нашел способа поиска / фильтрации по этому адресу.

введите описание изображения здесь

Есть ли какое-то представление в JM C, плагине или другом способе проверить, кто и когда блокирует и освобождает данный монитор?

1 Ответ

3 голосов
/ 03 августа 2020

Проблема в том, что ожидаемый объект монитора технически не удерживается никаким потоком. У такого монитора нет «хозяина». В общем, вы не можете заранее знать, какой поток отвечает за вызов notify, так как это может быть любой поток или не поток вообще.

Однако, если монитор уже был уведомлен, будет событие JFR, содержащее информацию о потоке уведомителя. Вы можете увидеть это на своем скриншоте: монитор был уведомлен потоком scala-execution-context-global-54.

...