forzar - garbage collector java example
¿Cuáles son las mejores configuraciones de recolección de basura para el lado del cliente? (5)
Las JVM recientes tienen muchos parámetros XX para la recolección de basura (ver aquí, por ejemplo), pero ¿cuáles son las opciones que pueden hacer que una aplicación Swing del lado del cliente realmente tenga un mejor rendimiento?
Debo señalar que una de las cosas que realmente me molesta en las aplicaciones Java del lado del cliente es la gran demora en la recolección de basura mundial. En Intelli-J IDEA lo he visto durar tres minutos o más.
EDITAR: Gracias por todas las respuestas. Solo para informarle agregué el recopilador de basura de CMS para IDEA (que es una buena referencia común del tipo de aplicación con la que la mayoría de las personas que están leyendo esta pregunta están familiarizadas) usando la configuración sugerida desde aquí . También configuro -XX: + StringCache para ver si reduce los requisitos de memoria.
En general, la observación es que el rendimiento de ejecución regular no se degrada hasta el punto en que puede observar mirarlo. La reducción de la memoria es enorme utilizando la opción Caché de cadena; sin embargo, el método CMS no es completo y termina requiriendo detener el ciclo mundial de recolección de basura (de vuelta a la espera de tres minutos) para borrar la memoria (400MB en una ejecución).
Sin embargo, dada la huella de memoria reducida, es posible que solo pueda poner una cantidad máxima de memoria más pequeña que evitará que las colecciones del mundo tengan tamaños más pequeños.
IDEA 8.1.4 viene con JDK 1.6.0_12, por lo que aún no he probado G1. Además, mi máquina solo tiene 2 núcleos, por lo que un enfoque G1 no se maximizará realmente. Es hora de golpear al jefe para obtener una máquina mejor;).
El ajuste de recolección de basura es más que un arte, luego una ciencia, y realmente depende de su aplicación y su uso. Si le molestan las estrategias estándar de detener el mundo, ¿por qué no convertir al CMS (marca concurrente y barrido) o al nuevo colector G1?
La mejor manera es cambiar los parámetros y adjuntar un generador de perfiles para examinar el comportamiento de la aplicación.
No existe la "mejor" opción (si la hubiera, alguien la usaría, ¿verdad?) Pero tal vez una opción que ayude en su caso. Pero aquí hay algunos consejos:
- Use la última máquina virtual El código de GC mejoró con cada lanzamiento.
- Utilice el cliente jvm.dll (disponible sinve Java 1.5 en
jre/bin/client/
). Esto debería ser el predeterminado. - Asignar y liberar objetos en Java es barato. Es costoso mantenerlos cerca.
No hay una sola respuesta a esta pregunta, depende en gran medida de lo que está haciendo su aplicación y cómo gestiona sus objetos. Tal vez eche un vistazo a cómo funciona la recolección de basura y colectores de basura paralelos y concurrentes para comprender las diversas opciones.
Luego, consulte el documento Java SE 6 HotSpot [tm] Virtual Machine Garbage Collection Tuning que amplía los conceptos y técnicas de sintonización de GC para Java SE 6 que se introdujeron en Tuning Garbage Collection con el documento 5.0 Java Virtual Machine .
Si desea mantener cortas las pausas de recolección de basura, es probable que el recopilador simultáneo sea la dirección correcta ya que realiza la mayor parte de su trabajo simultáneamente (es decir, mientras la aplicación aún se está ejecutando). Pero encontrar la mejor configuración requerirá un perfil (considere medir el rendimiento del GC, el tiempo de pausa máximo y promedio, la frecuencia de los GC completos y su duración también).
(EDITAR: Después de leer un comentario del OP, creo que leer Mi consejo sobre el ajuste de pila de JVM, ¡mantener los dedos fuera de las perillas!) Sería una buena idea para el gurú del rendimiento Kirk Pepperdine.
Si quieres un mejor rendimiento, entonces dale menos trabajo al recolector de basura. Considere usar un conjunto de objetos en lugar de crearlos constantemente y deshacerse de ellos, y asegúrese de que necesita todos los objetos que cree.
Esto es bastante automático y funciona para nosotros:
-server -Xss4096k -Xms12G -Xmx12G -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -Xmaxf1 -XX:+UseCompressedOops -XX:+DisableExplicitGC -XX:+AggressiveOpts -XX:+ScavengeBeforeFullGC -XX:CMSFullGCsBeforeCompaction=10 -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+CMSParallelRemarkEnabled -XX:GCTimeRatio=19 -XX:+UseAdaptiveSizePolicy -XX:MaxGCPauseMillis=500 -XX:+PrintGCTaskTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintTenuringDistribution -Xloggc:gc.log