1. Versión JDK
Todas las siguientes optimizaciones se basan en JDK8
la versión. Se recomienda encarecidamente actualizar a la versión inferior JDK8
y utilizar update_191
la última versión tanto como sea posible.
2. Cómo elegir un recolector de basura
Aplicación de respuesta primero: para las aplicaciones del lado C que son sensibles al tiempo de respuesta, se recomienda elegir G1 si la memoria del montón es más de 8G y elegir CMS si la memoria del montón es pequeña o la versión de JDK es baja;
Aplicación de prioridad de rendimiento: se recomienda seleccionar aplicaciones que no sean sensibles al tiempo de respuesta y apunten a un alto rendimiento (como MQ y Worker) ParallelGC
;
3. Optimizar parámetros de cada colector
1) Configuración de parámetros básicos (requerida para todas las aplicaciones y todos los colectores):
-Xmx(一般为容器内存的50%)
-Xms(与Xmx一致)
-XX:MetaspaceSize(通常256M~512M)
-XX:ParallelGCThreads=容器核数
-XX:CICompilerCount=容器核数(必须大于等于2)
2)ParallelGC
Además de los parámetros anteriores, generalmente no se requieren ajustes adicionales (colector predeterminado JDK8)
3)CMS
-XX:+UseConcMarkSweepGC
-Xmn (一般为堆内存的三分之一),尤其是配置了ParallelGCThreads后必须配置此参数
-XX:ConcGCThreads=n(默认为ParallelGCThreads/4,可视情况调整至ParallelGCThreads/2)
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70(推荐值)
4)G1
-XX:+UseG1GC
-XX:ConcGCThreads=n(默认为ParallelGCThreads/4,可视情况调整至ParallelGCThreads/2)
-XX:G1HeapRegionSize=8m(若堆内存在8G以内且有较多大对象推荐设置此值)
*Tenga cuidado de no configurar -Xmn y XX:NewRatio
5) Otros parámetros de ajuste
-XX:+ParallelRefProcEnabled
Si Reference
el tiempo de procesamiento de GC es largo, por ejemplo, WeakReference
se utiliza una gran cantidad de objetos, se puede habilitar el procesamiento paralelo a través de este parámetro
4. Encienda el registro del GC
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/export/Logs/gc.log
5. Cómo juzgar si el GC es normal
1) GC
Si es frecuente: YoungGC
la frecuencia es generalmente una décima de segundo, FullGC
generalmente varias veces al día, y G1
el colector no debe aparecer FullGC
;
2) GC
Consumo de tiempo: el consumo de tiempo depende principalmente del tamaño de la memoria del montón y la cantidad de objetos basura. YoungGC
El tiempo suele ser decenas de milisegundos, FullGC
normalmente cientos de milisegundos;
3) Si la memoria del GC cae cada vez: cuando la aplicación acaba de iniciarse, YoungGC
la memoria debe reciclarse a un nivel de agua más bajo cada vez. A medida que pasa el tiempo, la generación anterior aumentará gradualmente y el nivel de agua de la memoria aumentará gradualmente. hasta que la FullGC/MixedGC(G1)
memoria regrese al nivel de agua más bajo nuevamente. De lo contrario, puede haber una pérdida de memoria;
4) Si se usa ParallelGC
, solo se activará cuando se agote la memoria del montón FullGC
, por lo que no es necesario configurar la alarma de uso de la memoria del montón, pero debe prestar atención a GC
la frecuencia;