Понимание потока ссылочного обработчика - PullRequest
21 голосов
/ 05 октября 2011

Я продолжаю свой путь к глубокому пониманию Java Thread. К сожалению, моя сертификация Java не охватила эту часть, поэтому единственный способ научиться - это опубликовать серию глупых вопросов. За столько лет разработки Java я иногда задаюсь вопросом, сколько еще мне нужно выучить: -)

В частности, мое внимание теперь связано с потоком обработчика ссылок.

"Reference Handler" daemon prio=10 tid=0x02da3400 nid=0xb98 in Object.wait() [0x0302f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1aac0320> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:485)
    at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
    - locked <0x1aac0320> (a java.lang.ref.Reference$Lock)

Теперь следуют некоторые вопросы, для некоторых из них я знаю ответ, но я не публикую его, потому что я хотел бы услышать мнения других:

  1. Что должен делать поток Reference Handler?
  2. Дамп потока следует рассматривать снизу вверх. Почему трассировка стека начинается с заблокированного, не должен ли оператор блокировки появляться хотя бы после запуска потока?
  3. Что означает «родной метод»?
  4. Почему «Неизвестный источник», и в этом случае дамп потока не может вызвать исходный код?
  5. Наконец, ожидание и блокировка имеют то же самое, почему?

как обычно, прошу ответить на все вопросы, чтобы я мог пометить ответ.

Ответы [ 3 ]

12 голосов
/ 05 октября 2011
  1. I подозреваю он обрабатывает финализаторы для JVM. Это деталь реализации, поэтому она не указана в спецификации JVM.
  2. Это только означает, что java.lang.ref.Reference$Lock был заблокирован в методе, упомянутом в строке , предшествующей it (т.е. в ReferenceHandler.run().
  3. «Собственный метод» просто означает, что метод реализован в собственном (т.е. не в Java) коде (например, JNI).
  4. Неизвестный источник только означает, что файл .class не содержит никакой информации о местоположении исходного кода (по крайней мере, для этой конкретной точки). Это может произойти или , когда метод является синтетическим (здесь это не похоже) или класс был скомпилирован без отладочной информации.
  5. Когда поток ожидает на каком-либо объекте, тогда он должен заблокировал этот объект в какой-то момент по трассировке вызова, поэтому вы не можете на самом деле иметь waiting on без соответствующего locked.
4 голосов
/ 05 октября 2011

1) Поток финализатора вызывает методы финализатора. Ссылочная тема имеет аналогичное назначение.

http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/lang/java/lang/ref/Reference.java.htm

Источник OpenJDK утверждает, что это

Поток с высоким приоритетом для постановки в очередь ожидающих ссылок

GC создает простой связанный список ссылок, которые необходимо обработать, и этот поток быстро добавляет их в соответствующую очередь. Причина, по которой это делается в два этапа, заключается в том, что GC не делает ничего, кроме поиска ссылок, этот поток вызывает код, который обрабатывает эти ссылки, например, Вызов очистителей и уведомляет слушателей ReferenceQueue.

2) Блокировка приобретается для синхронизированного метода до его ввода.

3-5) покрыто Иоахимом;)

2 голосов
/ 05 октября 2011

Ух ты, слишком глубоко для меня. Я могу ответить только на один или два ваших вопроса.

«Собственный метод» просто означает, что реализация этого метода находится в некоторой нативной (то есть C или C ++) библиотеке. Как только стек вызовов стал "родным", JVM больше не может его отслеживать. У него нет возможности предоставить дополнительную информацию о стеке.

«Неизвестный источник», вероятно, означает, что код был скомпилирован с включенной оптимизацией и отключенной информацией отладки (флаг -g?). Это исключает информацию о файле / строке из файла .class.

...