Java 7 ha estado disponible por un tiempo, pero no puedo encontrar buenos recursos sobre la configuración de los recolectores de basura , específicamente el nuevo recolector G1 .
Mis preguntas:
- ¿Es G1 el recopilador predeterminado en Java 7 y si no, cómo activo G1?
- ¿Qué configuraciones opcionales tiene g1 en Java7?
- ¿Se realizaron cambios en otros colectores como cms o el colector paralelo en Java 7?
- ¿Dónde puedo encontrar buena documentación sobre la recolección de basura en Java 7?
java
garbage-collection
java-7
heap-memory
g1gc
Florakel
fuente
fuente
Respuestas:
El recolector de basura G1 no es el predeterminado en mi instalación de Java, versión 1.7.0_01. Puede verlo usted mismo usando algunas opciones de línea de comando adicionales:
> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -version -XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:ParallelGCThreads=4 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC java version "1.7.0_01" Java(TM) SE Runtime Environment (build 1.7.0_01-b08) Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode) Heap PSYoungGen total 37696K, used 1293K [0x00000007d5eb0000, 0x00000007d88c0000, 0x0000000800000000) eden space 32320K, 4% used [0x00000007d5eb0000,0x00000007d5ff3408,0x00000007d7e40000) from space 5376K, 0% used [0x00000007d8380000,0x00000007d8380000,0x00000007d88c0000) to space 5376K, 0% used [0x00000007d7e40000,0x00000007d7e40000,0x00000007d8380000) PSOldGen total 86144K, used 0K [0x0000000781c00000, 0x0000000787020000, 0x00000007d5eb0000) object space 86144K, 0% used [0x0000000781c00000,0x0000000781c00000,0x0000000787020000) PSPermGen total 21248K, used 2032K [0x000000077ca00000, 0x000000077dec0000, 0x0000000781c00000) object space 21248K, 9% used [0x000000077ca00000,0x000000077cbfc288,0x000000077dec0000)
Sin embargo, ya no es necesario habilitar las opciones experimentales para activar el colector G1:
> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseG1GC -version -XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation java version "1.7.0_01" Java(TM) SE Runtime Environment (build 1.7.0_01-b08) Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode) Heap garbage-first heap total 130048K, used 0K [0x000000077ca00000, 0x0000000784900000, 0x00000007fae00000) region size 1024K, 1 young (1024K), 0 survivors (0K) compacting perm gen total 20480K, used 2032K [0x00000007fae00000, 0x00000007fc200000, 0x0000000800000000) the space 20480K, 9% used [0x00000007fae00000, 0x00000007faffc288, 0x00000007faffc400, 0x00000007fc200000) No shared spaces configured.
No sé dónde puede encontrar una buena documentación.
fuente
-XX:+UseParallelGC
.Oracle finalmente hizo oficial G1 en Java 7 U4: http://www.oracle.com/technetwork/java/javase/7u4-relnotes-1575007.html
Descripción: http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html
Opciones de la línea de comandos: http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#G1Options
Aún así, no creo que sea el recopilador predeterminado en Java 7. Para los servidores, el predeterminado es Parallel Collector como en Java 6.
fuente
Sí, G1 es el nuevo recolector de basura estándar en Java 1.7 JVM.
Aquí puede encontrar mucha información sobre cómo usar y configurar el nuevo recolector de basura:
También he encontrado este artículo muy útil para comprender los aspectos internos de G1.
Incluso más información aquí .
fuente
1. ¿Es G1 el recopilador predeterminado en Java 7 (...)
La regla en esta página de Java 5 todavía es aplicable en Java 7 (y AFAIK, Java 8):
Pero también considere:
-client
VM, por lo que siempre son de "clase de servidor"Por ejemplo, si en Windows x64 ejecuta ...
1. (...) ¿cómo activo G1?
A partir de Java 7, simplemente
-XX:+UseG1GC
. Quizás también sea de interés cuándo desearía:2. ¿Qué configuraciones opcionales tiene g1 en Java7?
Yo no he usado G1, pero deduzco que se adhiere a los mismos indicadores básicos de "rendimiento / ergonomía" que se usan para sintonizar los otros colectores paralelos. En mi experiencia con Parallel GC,
-XX:GCTimeRatio
ha sido fundamental para proporcionar el equilibrio esperado entre velocidad y memoria. YMMV.Las opciones específicas de G1 se enumeran aquí
3. ¿Hubo cambios en (...) cms o el colector paralelo en Java 7?
No lo sé, pero ...
4. ¿Dónde puedo encontrar buena documentación sobre la recolección de basura en Java 7?
Puede ser doloroso encontrarlo, ¿no? Probablemente, la mejor página "central" que he encontrado es esta:
http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140228.html
Se requiere algo de lectura profunda, pero vale la pena el tiempo si necesita hacer algunos ajustes. Particularmente revelador es: Ergonomía del recolector de basura
fuente
G1 no es el recopilador predeterminado en Java 7.
-XX:+UseG1GC
habilitará G1GCHay muchos. Eche un vistazo a este artículo de Oracle para obtener información completa.
Por esta razón, personalice los parámetros críticos
y deje todos los demás parámetros al valor predeterminado .
A continuación, se muestra una lista de opciones importantes y sus valores predeterminados. Esta lista se aplica a la última máquina virtual Java HotSpot, compilación 24. Puede adaptar y ajustar la configuración de G1 GC en la línea de comandos de JVM.
Valores predeterminados importantes:
Establece el tamaño de una región G1. El valor será una potencia de dos y puede oscilar entre 1 MB y 32 MB. El objetivo es tener alrededor de 2048 regiones basadas en el tamaño mínimo del montón de Java.
-XX:MaxGCPauseMillis=200
Establece un valor objetivo para el tiempo máximo de pausa deseado. El valor predeterminado es 200 milisegundos. El valor especificado no se adapta a su tamaño de pila.
-XX:G1NewSizePercent=5
Establece el porcentaje del montón que se utilizará como mínimo para el tamaño de la generación joven. El valor predeterminado es el 5 por ciento de su montón de Java.
-XX:G1MaxNewSizePercent=60
Establece el porcentaje del tamaño del montón que se utilizará como máximo para el tamaño de la generación joven. El valor predeterminado es el 60 por ciento de su montón de Java.
Establece el valor de los subprocesos de trabajo STW. Establece el valor de n en el número de procesadores lógicos. El valor de n es el mismo que el número de procesadores lógicos hasta un valor de 8.
Si hay más de ocho procesadores lógicos, establece el valor de n en aproximadamente 5/8 de los procesadores lógicos. Esto funciona en la mayoría de los casos excepto en sistemas SPARC más grandes donde el valor de n puede ser aproximadamente 5/16 de los procesadores lógicos.
Establece el número de hilos de marcado paralelos. Establece n en aproximadamente 1/4 del número de subprocesos de recolección de basura paralelos (ParallelGCThreads).
-XX:InitiatingHeapOccupancyPercent=45
Establece el umbral de ocupación del montón de Java que activa un ciclo de marcado. La ocupación predeterminada es el 45 por ciento de todo el montón de Java.
-XX:G1MixedGCLiveThresholdPercent=65
Establece el umbral de ocupación para que una región antigua se incluya en un ciclo de recolección de basura mixta. La ocupación predeterminada es del 65 por ciento
-XX:G1HeapWastePercent=10
Establece el porcentaje de montón que está dispuesto a desperdiciar. La máquina virtual Java HotSpot no inicia el ciclo de recolección de basura mixta cuando el porcentaje recuperable es menor que el porcentaje de desperdicio de pila
-XX:G1MixedGCCountTarget=8
Establece el número objetivo de recolecciones de basura mixtas después de un ciclo de marcado para recolectar regiones antiguas con como máximo G1MixedGCLIveThresholdPercent datos en vivo. El valor predeterminado es 8 recolecciones de basura mixtas
-XX:G1OldCSetRegionThresholdPercent=10
Establece un límite superior en la cantidad de regiones antiguas que se recopilarán durante un ciclo de recolección de basura mixta. El valor predeterminado es el 10 por ciento del montón de Java
-XX:G1ReservePercent=10
Establece el porcentaje de memoria de reserva que se debe mantener libre para reducir el riesgo de desbordamientos de espacio. El valor predeterminado es el 10 por ciento. Cuando aumente o disminuya el porcentaje, asegúrese de ajustar el montón de Java total en la misma cantidad.
Ha vuelto a configurar muchos parámetros de G1GC, que no son necesarios si sigue la página de documentación anterior. Verifique las recomendaciones anteriores, especialmente en ParallelGCThreads y ConcGCThreads , que se basarán en los núcleos de su CPU. Elimine la reconfiguración de los parámetros innecesarios.
Recomendaciones de Oracle:
Cuando evalúe y ajuste G1 GC, tenga en cuenta las siguientes recomendaciones:
Tamaño de la generación joven : Evite establecer explícitamente el tamaño de la generación joven con la
-Xmn
opción o cualquier otra opción relacionada, como-XX:NewRatio
. La fijación del tamaño de la generación joven anula el objetivo de tiempo de pausa .Objetivos de tiempo de pausa: cuando evalúa o ajusta cualquier recolección de basura, siempre existe una compensación entre latencia y rendimiento. El G1 GC es un recolector de basura incremental con pausas uniformes, pero también más sobrecarga en los subprocesos de la aplicación. El objetivo de rendimiento del G1 GC es el 90 por ciento del tiempo de aplicación y el 10 por ciento del tiempo de recolección de basura .
Hay algunos cambios con Java 7. Eche un vistazo a este artículo.
Consulte la página de documentación de Oracle sobre gc y la pregunta SE relacionada:
Recolección de basura Java G1 en producción
fuente
No G1 no es el recolector de basura predeterminado en jdk 1.7.0_02. El recolector de basura predeterminado depende de la clase de máquina. Si la máquina es de la clase Server, el recolector de basura predeterminado es Throughput Collector. Si la máquina es de la clase Client, el recolector de basura predeterminado es Serial Collector.
fuente
La documentación disponible en http://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html (el enlace proporcionado por Wojtek) parece ser el único enlace oficial con información pero la información parece desactualizado ya que algunas de las banderas mencionadas solo estaban disponibles en las versiones de prueba, ya no existen en las versiones de producción. Alguien de Oracle debería proporcionar documentación actualizada sobre el G1 GC.
fuente
Por defecto, realmente no desea utilizar el recopilador G1, ya que no es realmente mejor que los demás. Solo es bueno para propósitos especiales.
En aplicaciones de baja latencia, es un poco mejor que CMS, ya que tiene tiempos de pausa un poco más cortos y predecibles. A cambio, el rendimiento es mucho peor que CMS a cambio.
Por lo tanto, solo es bueno si la latencia es importante, pero el rendimiento no es importante en absoluto. Si ambos son importantes, quédese con CMS.
fuente