más aplicaciones Java crear objetos Java y luego desecharlos con bastante rapidez por ejemplo. creas algunos objetos en un método y luego, una vez que salgas del método, todo el objeto muere. La mayoría de las aplicaciones se comportan de esta manera y la mayoría de las personas tiende a codificar sus aplicaciones de esta manera. El montón de Java se divide aproximadamente en 3 partes, generación permanente, antigua (larga vida) y generación joven (de vida corta). Young gen se divide en S1, S2 y eden. Estos son solo montones.
La mayoría de los objetos se crean en la generación joven. La idea aquí es que, dado que la tasa de mortalidad de los objetos es alta, los creamos rápidamente, los usamos y luego los descartamos. La velocidad es de esencia. A medida que crea objetos, el gen joven se llena, hasta que se produce un GC menor. En un GC menor, todos los objetos que están vivos se copian de eden y dicen S2 a S1. Luego, el 'puntero' se basa en eden y S2.
Cada copia envejece el objeto. Por defecto, si un objeto sobrevive 32 copias, viz. 32 GC menor, luego el CG calcula que va a durar mucho más tiempo. Entonces, lo que hace es mantenerlo, moviéndolo a la generación anterior. La vieja generación es solo un gran espacio. Cuando el gen viejo se llena, un GC completo o GC mayor ocurre en la vieja generación. Como no hay otro espacio para copiar, el GC debe compactarse. Esto es mucho más lento que GC menor, es por eso que evitamos hacer eso con más frecuencia.
Se puede sintonizar con el parámetro tenuring
java -XX:MaxTenuringThreshold=16
si usted sabe que usted tiene un montón de objetos de larga vida. Puede imprimir el intervalo de varias edades de su aplicación con
java -XX:-PrintTenuringDistribution
Me parece que muchas de las respuestas son _describiendo_ recolección de basura en lugar de la razón _por qué_ una colección de basura eden es más rápida que una colección de basura de espacio superviviente, a menos que estén implicando que es la copia de referencias a los grupos de más largo plazo eso toma el tiempo. –