JVM Дампы, содержащие мониторы без блокировки потоков - PullRequest
8 голосов
/ 15 сентября 2008

Что может быть причиной дампов потоков JVM, которые показывают потоки, ожидающие блокировки на мониторе, но мониторы не имеют соответствующих потоков блокировки?

Java 1.5_14 в Windows 2003

Ответы [ 6 ]

1 голос
/ 17 сентября 2008

Эти ожидающие потоки ждут вечно или они в конечном итоге продолжаются?

Если последнее, возможно, блокировка удерживается сборщиком мусора.

Вы можете добавить аргументы -verbose:gc with -XX:+PrintGCDetails в командной строке Java, чтобы сообщить, когда происходят GC. Если активность gc совпадает с вашими замедлениями, это может указывать на то, что это проблема.

Вот некоторая информация о сборке мусора .

1 голос
/ 17 сентября 2008

Использует ли ваш код при любых изменениях какой-либо JNI? (т. е. вы используете какой-либо нативный код, запущенный с Java?).

Мы видели подобное поведение, но JDK 1.6.0_05. Приложение появляется в тупике, но Jstack показывает потоки, ожидающие блокировки, которую не удерживают другие потоки. У нас есть некоторый код JNI, поэтому, возможно, мы что-то испортили.

Мы не нашли решения для этого, и проблема воспроизводима только на 1 машине.

0 голосов
/ 16 сентября 2010

Вы пробовали обновиться до Java 1.6? Ошибка может быть вашей проблемой, если вы используете только 1.5.

0 голосов
/ 16 сентября 2010

У меня была похожая проблема сегодня, и она также включала доступ к статическим ресурсам.

Короткая версия состоит в том, что класс сделал изменения графического интерфейса пользователя в статическом блоке и вне потока AWT-EventQueue, которые были заблокированы AWT TreeLock, затем EventQueue сделал ссылку на заблокированный класс, что вынудило его подождите на мониторе загрузчика классов для этого класса.

Ключевое наблюдение здесь заключается в том, что блокировка загрузчика классов не отображается как заблокированная в дампе потока.

Полный ответ можно найти в этой теме .

0 голосов
/ 16 сентября 2008

Да, обычно у каждого заблокированного монитора должна быть ветка владельца. Возможно, ваш дамп стека был неполным (слишком длинным) или, возможно, дамп был непоследовательным. Я мог предположить, что это не останавливает мир, поэтому заблокированный монитор сбрасывается, но поток, которому принадлежит блокировка, освобождает его перед сбросом (это только предположение).

Можете ли вы кое-где загрузить дамп в виде текстового файла для облегчения поиска и скажите нам, какой монитор вы просматриваете.

0 голосов
/ 15 сентября 2008

Это просто дикое предположение, но может ли быть так, что поток блокирует себя, пытаясь получить блокировку дважды? Вероятно, это помогло бы, если бы вы могли опубликовать некоторый код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...