Cuidado ... GC puede ser un tema peludo si no tiene cuidado. Dentro de cualquier tiempo de ejecución (JVM para Java/CLR para .Net) hay varios procesos que tienen lugar. En general, hay una optimización de la memoria en etapas tempranas (Young Generational Garbage Collection/Young Gen GC & Old Generational Garbage Collection/Old Gen GC). El gen gc joven ocurre regularmente y se lo suele atribuir a sus pausas/hipo más pequeños. La antigua generación de gc es normalmente lo que está sucediendo cuando se ven las largas pausas de "detener el mundo".
¿Por qué usted puede ser que pregunte? La razón por la que obtiene pausas con su tiempo de ejecución/JVM es que cuando el tiempo de ejecución realiza su limpieza del Heap, tiene que pasar por lo que se denomina un cambio de fase. Detiene los hilos que ejecutan su aplicación para marcar e intercambiar punteros para optimizar su memoria disponible. Yong gen es más rápido ya que libera principalmente objetos que son solo temporales. La generación anterior, sin embargo, evalúa todos los objetos en el montón y cuando te quedas sin memoria se activará para liberar la memoria que tanto se necesita.
¿Por qué la precaución? La vieja generación empeora exponencialmente en el tiempo de pausa, cuanto más montón usas. con un tamaño de pila total de 2-4 GB, debería estar bien en tiempos de ejecución modernos como Java 6 (JDK 1.6+). Una vez que vaya más allá de ese límite, verá aumentos exponenciales en los tiempos de pausa. Me he encontrado con algunos clientes que tienen que reiniciar los servidores, ya que en algunos casos excepcionales en que un montón es grande, los tiempos de pausa del GC pueden llevar más tiempo que un reinicio completo.
Existen algunas herramientas nuevas que son geniales y que le pueden dar una punta de lanza en la evaluación de si el GC es su dolor. JHiccup es uno y es gratis desde el sitio web azulsystems. En este momento, creo que es solo para Linux. También tienen una JVM que tiene un algoritmo GC reconstruido que se ejecuta sin pausa ... pero si estás en una implementación de servidor único con una aplicación no crítica, puede que no sea rentable (esa no es gratis).
En resumen: si su tiempo de ejecución/JVM/CLR es menos de 2 GB, agregar más memoria ayudará. Asegúrate de darte un poco de sobrecarga. Si es posible, nunca desea alcanzar el 100% del tamaño de Heap/Memory. Es entonces cuando las largas pausas son las más largas. Date un 20% más de memoria sobre lo que crees que necesitarás. De esta forma, tienes espacio para que los algoritmos de GC muevan objetos para su optimización. Si alguna vez planea ir en grande ... hay una herramienta que arregla la tecnología JVM circa 1990 (Azul Systems Zing JVM), pero no es gratis. Ofrecen una herramienta de código abierto para diagnosticar problemas de GC. JVM (como lo he probado) también tiene una herramienta de visibilidad de nivel de hilos realmente genial que le permite informar sobre fugas, errores o bloqueos en la producción sin gastos generales (algún truco con la descarga de datos que la JVM ya maneja y estampación de tiempo). Eso ha ahorrado toneladas de tiempo de prueba de desarrollo ... pero nuevamente, no para aplicaciones pequeñas.
Permanezca debajo de 4 GB. Dar espacio libre adicional. Y si se desea se puede activar estas banderas para controlar GC para Java/JVM:
java -verbose:gc myProgram
java -Xloggc:D:/log/myLogFile.log -XX:+PrintGCDetails myProgram
Usted puede probar algunos de los otros colectores utiliza hotspot. Hay más de uno
Si está en Linux, intente con la herramienta JHiccup también. Es gratis.
Me gustaría señalar que el Azul Zing jvm en muchos casos "es" más eficiente. Hacen gC detrás de escena mientras la aplicación se está ejecutando. Bastante genial. Nuevamente, no es gratis, pero para aquellos que deseen eliminar la necesidad de sintonizar una JVM, ésta puede hacerlo. Creo que lo llaman su colector C4 (concurrente, continuo, compactación, ¿coleccionista?). Un punto de referencia reciente de Mike McCandless lo probó en Apache Lucene/Solr contra CMS. Excelentes resultados en escalabilidad: http://blog.mikemccandless.com/2012/07/lucene-index-in-ram-with-azuls-zing-jvm.html He estado siguiendo esto ya que cambia el juego –