¿Qué causa que la JVM realice una recolección de basura importante?

Tengo una aplicación Java que muestra diferentes comportamientos de GC en diferentes entornos. En un entorno, el gráfico de uso de almacenamiento dinámico es un diente de sierra lento con GC principales cada 10 horas aproximadamente, solo cuando el almacenamiento dinámico está> 90% lleno. En otro entorno, la JVM realiza GC principales cada hora en punto (el montón normalmente está entre 10% y 30% en estos momentos).

Mi pregunta es, ¿cuáles son los factores que hacen que la JVM decida hacer un GC importante?

Obviamente, se acumula cuando el montón está casi lleno, pero hay otra causa en juego que supongo que está relacionada con una tarea programada por hora dentro de mi aplicación (aunque no hay un aumento en el uso de memoria en este momento).

Supongo que el comportamiento de GC depende en gran medida de la JVM; Estoy usando:

Servidor Java HotSpot (TM) de 64 bits VM 1.7.0_21 Oracle CorporationNo hay opciones de GC específicas, por lo que utiliza la configuración predeterminada para el servidor de 64 bits (PS MarkSweep y PS Scavenge)

Otra información:

Esta es una aplicación web que se ejecuta en Tomcat 6.La generación permanente está alrededor del 10% en ambos entornos.El entorno con el comportamiento de diente de sierra tiene un almacenamiento dinámico máximo de 7 Gb, el otro tiene 14 Gb.

Por favor, sin conjeturas. La JVM debe tener reglas para decidir cuándo realizar un GC importante, y estas reglas deben estar codificadas en la fuente en algún lugar. Si alguien sabe lo que son, o dónde están documentados, ¡por favor comparta!

Respuestas a la pregunta(4)

Su respuesta a la pregunta