java reference thread-dump

java - Entendiendo el hilo del Controlador de Referencia



reference thread-dump (3)

Continúo mi camino hacia la comprensión profunda de Java Thread. Desafortunadamente, mi certificación Java no cubrió esa parte, por lo que la única forma de aprender es publicar una serie de preguntas tontas. Con tantos años de desarrollo de Java, a veces me pregunto cuánto tengo que aprender :-)

En particular, mi atención ahora está con el hilo del controlador de referencia.

"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)

Ahora algunas preguntas siguen, para algunas de ellas sé la respuesta, pero no la estoy publicando, porque me gustaría escuchar las opiniones de alguien más:

  1. ¿Qué se supone que hace el hilo del Controlador de referencia?
  2. Un volcado de hilo debe considerarse de abajo hacia arriba, ¿por qué el rastreo de pila comienza con bloqueado? ¿No debería aparecer la instrucción de bloqueo al menos después de que se haya ejecutado el hilo?
  3. ¿Qué significa "Método Nativo"?
  4. ¿Por qué "Fuente desconocida", en cuyo caso el volcado de hilo no puede recuperar el código fuente?
  5. Por último, la espera y el bloqueo tienen lo mismo, ¿por qué?

Como de costumbre, le pido que responda todas las preguntas para poder marcar las respuestas.


  1. Sospecho que maneja los finalizadores en ejecución para la JVM. Es un detalle de implementación y, como tal, no se especifica en la especificación JVM.
  2. Esto solo significa que java.lang.ref.Reference$Lock se bloqueó en el método mencionado en la línea que lo precede (es decir, en ReferenceHandler.run() .
  3. "Método nativo" simplemente significa que el método se implementa en código nativo (es decir, no Java) (piense en JNI).
  4. La fuente desconocida solo significa que el archivo .class no contiene ninguna información de ubicación del código fuente (al menos para este punto específico). Esto puede suceder cuando el método es sintético (no se ve aquí) o la clase se compiló sin información de depuración.
  5. Cuando un hilo espera en algún objeto, entonces debe haber bloqueado ese objeto en algún punto del rastreo de llamadas, por lo que realmente no puede tener una waiting on sin un locked correspondiente.

1) El subproceso del finalizador llama a los métodos del finalizador. El hilo de referencia tiene un propósito similar.

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

La fuente de OpenJDK afirma que es una

Subproceso de alta prioridad para poner en cola las referencias pendientes

El GC crea una lista enlazada simple de referencias que deben procesarse y este hilo las agrega rápidamente a una cola adecuada. La razón por la que esto se hace en dos fases es que el GC no hace nada más que encontrar las Referencias, este hilo llama al código que maneja esas referencias, por ejemplo, a los limpiadores de llamadas, y notifica a los oyentes de ReferenceQueue.

2) Se adquiere un bloqueo para un método sincronizado antes de ingresar.

3-5) cubierto por Joachim;)


Wow, demasiado profundo para mí. Solo puedo responder a una o dos de sus preguntas.

"Método nativo" simplemente significa que la implementación de ese método se encuentra en alguna biblioteca nativa (es decir, C o C ++). Una vez que la pila de llamadas se ha "vuelto nativa", la JVM ya no puede monitorearla. No hay forma de que proporcione información adicional de la pila.

"Fuente desconocida" probablemente significa que el código se compiló con la optimización activada y la información de depuración desactivada (¿ -g ?). Esto elimina la información del archivo / línea del archivo .class.