Ответ 1
TID - это идентификатор идентификатора, а NID - это: собственный идентификатор потока. Этот идентификатор сильно зависит от платформы. Это NID в дампе потока jstack. В Windows это просто идентификатор потока на уровне ОС внутри процесса. В Linux и Solaris это PID потока (что, в свою очередь, является легковесным процессом). В Mac OS X это называется родным значением pthread_t.
Перейдите по этой ссылке: Идентификатор потока уровня Java: для определения и дальнейшего объяснения этих двух терминов.
На сайте IBM я нашел эту ссылку: Как интерпретировать дамп потока. это охватывает это более подробно:
Это объясняет, что означает ожидание: блокировка не позволяет нескольким объектам получить доступ к общему ресурсу. Каждый объект в Java ™ имеет связанную блокировку (полученную с помощью синхронизированного блока или метода). В случае JVM потоки конкурируют за различные ресурсы в JVM и блокируют объекты Java.
Затем он описывает монитор как особый вид механизма блокировки, который используется в JVM для обеспечения гибкой синхронизации между потоками. Для целей этого раздела прочитайте термины "монитор" и "взаимозаменяемо".
Тогда это идет дальше:
Чтобы избежать мониторинга каждого объекта, JVM обычно использует флаг в блоке класса или метода, чтобы указать, что элемент заблокирован. Большую часть времени фрагмент кода будет проходить через некоторые заблокированные разделы без конфликтов. Следовательно, флага-хранителя достаточно, чтобы защитить этот фрагмент кода. Это называется плоский монитор. Однако, если другой поток хочет получить доступ к какому-либо заблокированному коду, произошел настоящий конфликт. JVM должна теперь создать (или раздуть) объект монитора для удержания второго потока и организовать механизм сигнализации для координации доступа к разделу кода. Этот монитор теперь называется надутым монитором.
Вот более подробное объяснение того, что вы видите в строках из дампа потока. Поток Java реализован собственным потоком операционной системы. Каждый поток представлен жирным шрифтом, например:
"Thread-1" (TID: 0x9017A0, sys_thread_t: 0x23EAC8, состояние: R, собственный идентификатор: 0x6E4) prio = 5
* Следующие 6 пунктов объясняют это, поскольку я сопоставил их с примером, значения в скобках []:
- имя [ Тема-1 ],
- идентификатор [ 0x9017A0 ],
- Адрес структуры данных JVM [ 0x23EAC8 ],
- текущее состояние [ R ],
- собственный идентификатор потока [ 0x6E4 ],
- и приоритет [ 5 ].
"Ожидание при включении" представляется потоком демона, связанным с самим jvm, а не с самим потоком приложения. Когда вы получаете "in Object.wait()", это означает, что поток демона, здесь "finalizer", ожидает уведомления о блокировке объекта, в этом случае он показывает, какое уведомление он ожидает: "- ожидание <0x27ef0288> (java.lang.ref.ReferenceQueue $ Lock) "
Определение ReferenceQueue: эталонные очереди, к которым зарегистрированные сборщики объектов добавляются сборщиком мусора после обнаружения соответствующих изменений достижимости.
Выполняется поток финализатора, поэтому сборщик мусора очищает ресурсы, связанные с объектом. Если я вижу это по сути, финализатор не может получить блокировку для этого объекта: java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118), потому что объект java выполняет метод, поэтому поток финализатора заблокирован, пока этот объект не будет завершен с текущей задачей.
Кроме того, финализатор не просто пытается восстановить память, он более сложен, чем очистка ресурсов. Мне нужно больше изучить его, но если у вас есть открытые файлы, сокеты и т.д., Связанные с методами объектов, то финализатор также будет работать над освобождением этих элементов.
Какая цифра в квадратных скобках после Object.wait в дампе потока?
Это указатель в памяти на поток. Вот более подробное описание:
C.4.1 Информация о потоке
Первая часть раздела потока показывает поток, который вызвал фатальную ошибку, следующим образом:
Current thread (0x0805ac88): JavaThread "main" [_thread_in_native, id=21139]
| | | | +-- ID
| | | +------------- state
| | +-------------------------- name
| +------------------------------------ type
+-------------------------------------------------- pointer
Указатель потока - это указатель на структуру внутреннего потока Java VM. Обычно это не представляет интереса, если вы не отлаживаете живую виртуальную машину Java или файл ядра.
Это последнее описание взято из: Руководство по устранению неполадок для Java SE 6 с HotSpot VM
Вот еще несколько ссылок на дампы потоков:
- Как работают темы
- Как проанализировать дамп потока
- Дампы Java-дампов
- Потоки Java VM
- Вопрос Stackoverflow: как отображаются потоки