Solución:
Cada objeto en el montón de Java tiene un encabezado que es utilizado por el algoritmo Garbage Collection (GC). El recolector de espacio joven (que es responsable de la promoción de objetos) usa algunos bits de este encabezado para rastrear el número de colecciones de objetos que han sobrevivido (JVM de 32 bits usa 4 bits para esto, 64 bits probablemente algunos más) .
Durante la recolección de espacios jóvenes, se copia cada objeto. El Objeto se puede copiar en uno de los espacios de supervivencia (uno que está vacío antes de la GC joven) o en el espacio antiguo. Para cada objeto que se copia, el algoritmo GC aumenta su edad (número de colección sobrevivida) y si la edad está por encima de la actual umbral de tenencia se copiaría (promocionaría) al espacio antiguo. El Objeto también se puede copiar al espacio antiguo directamente si el espacio de supervivencia se llena (desbordamiento).
El viaje de Object tiene el siguiente patrón:
- asignado en el edén
- copiado de eden al espacio de supervivencia debido a la joven GC
- copiado de supervivencia a (otro) espacio de supervivencia debido a GC joven (esto podría suceder pocas veces)
- promovido de supervivencia (o posible eden) al espacio antiguo debido a GC joven (o GC completo)
el actual umbral de tenencia JVM lo ajusta dinámicamente, pero MaxTenuringThreshold establece un límite superior.
Si establece MaxTenuringThreshold = 0, todos los objetos se promoverán inmediatamente.
Tengo algunos artículos sobre la recolección de basura de Java, allí puede encontrar más detalles.
(Descargo de responsabilidad: esto solo cubre HotSpot VM)
Como afirma Alexey, la JVM determina dinámicamente el umbral de tenencia realmente utilizado. Hay muy poco valor en configurarlo. Para la mayoría de las aplicaciones, el valor predeterminado de 15 será lo suficientemente alto, ya que normalmente muchos más objetos sobreviven a la colección. Cuando muchos objetos sobreviven a la colección, los espacios de supervivientes se desbordan directamente hacia los viejos. A esto se le llama promoción prematura y es un indicador de un problema. Sin embargo, rara vez se puede resolver ajustando MaxTenuringThreshold.
En esos casos, a veces SurvivorRatio podría usarse para aumentar el espacio en los espacios de sobrevivientes, permitiendo que la tenencia funcione realmente. Sin embargo, la mayoría de las veces ampliar la generación joven es la única buena opción (desde la perspectiva de la configuración). Si está mirando desde la perspectiva de la codificación, debe evitar la asignación excesiva de objetos para permitir que la tenencia funcione como se diseñó.
Para responder exactamente a lo que preguntó: cuando un objeto alcanza su umbral de tenencia determinado por JVM, se copia a antiguo. Antes de eso, se copiará en el espacio de superviviente vacío. Los objetos que han sobrevivido un tiempo, pero que se eliminan de la referencia antes de alcanzar el umbral, se limpian de los sobrevivientes de manera muy eficiente.