Tal vez un poco tarde, pero la explicación actual es completamente insatisfactoria para mí y creo que tengo una explicación más sensata.
En primer lugar, cada java GC realiza algún tipo de rastreo desde un conjunto raíz de una manera u otra. Esto significa que si se recolecta el encabezado anterior no leeremos la variable next
de ninguna manera; no hay ninguna razón para hacerlo. Por lo tanto, IF cabeza se recoge en la siguiente iteración, no importa.
El IF en la oración anterior es la parte importante aquí. La diferencia entre la configuración al lado de algo diferente no es importante para recolectar la cabeza, pero puede hacer una diferencia para otros objetos.
Supongamos un GC generacional simple: si la cabeza está en el conjunto joven, de todos modos se recogerá en el siguiente GC. Pero si está en el conjunto anterior, solo se recopilará cuando hagamos un GC completo, lo que ocurre con poca frecuencia.
Entonces, ¿qué sucede si la cabeza está en el conjunto anterior y hacemos un GC joven?En este caso, la JVM supone que todos los objetos en el antiguo montón todavía están vivos y agrega todas las referencias de los objetos antiguos a los jóvenes al conjunto raíz del GC joven. Y eso es exactamente lo que la tarea evita aquí: escribir en el antiguo montón generalmente está protegido con una barrera de escritura o algo así para que la JVM pueda atrapar tales asignaciones y manejarlas correctamente; en nuestro caso, elimina el objeto next
apuntado desde el conjunto raíz que tiene consecuencias
ejemplo corto:
Asumamos que tenemos 1 (old) -> 2 (young) -> 3 (xx)
. Si eliminamos 1 y 2 ahora de nuestra lista, podemos esperar que ambos elementos sean recopilados por el próximo CG. Pero si solo se produce un GC joven y NO hemos eliminado el puntero next
en antiguo, no se recopilarán los elementos 1 y 2. Contrariamente a esto si hemos eliminado el puntero en 1, 2 serán recogidos por los jóvenes GC ..
tal vez no está actualizado el comentario (se puede encontrar el control de versiones y localizar el comentario para la confirmación?) :) – milan
Es interesante que esta var temp y comentario se añadieron sólo en java 7. Entonces definitivamente fue por alguna intención. Consulta http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/LinkedBlockingQueue.java#LinkedBlockingQueue.extract%28%29 y http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/concurrent/LinkedBlockingQueue.java#LinkedBlockingQueue.dequeue%28%29 – Vadzim
que es openjdk, LinkedBlockingQueue en el Oracle jdk 6 en Mac (1.6.0_29-b11-402.jdk) tiene la variable de temperatura. – milan