Me he dado cuenta de que al reproducir audio en java, el escenario MarkSweepCompact en gc es demasiado largo y da como resultado cortos períodos de silencio, lo cual es inaceptable. Entonces necesito usar una pausa baja en gc. He intentado Parallel y CMS, parecen funcionar mejor porque supongo que la pausa es más corta y no hacen la recopilación completa tan a menudo como la predeterminada.Tuning GC para la aplicación de audio Java
Hasta ahora hemos probado mi programa con las siguientes opciones para ParallelGC:
-XX:+UseParallelGC
-XX:MaxGCPauseMillis=70
y para ConcurrentMarkSweep:
-XX:+UseConcMarkSweepGC
-XX:+CMSIncrementalMode
-XX:+CMSIncrementalPacing
También probé G1GC, pero todavía es experimental en Java 6. Opciones para ambos modos:
-Xms15m
-Xmx40m
-XX:+UnlockExperimentalVMOptions
-XX:+CMSClassUnloadingEnabled
-XX:+TieredCompilation
-XX:+AggressiveOpts
-XX:+UseAdaptiveSizePolicy
-Dsun.java2d.noddraw=false
-Dswing.aatext=true
-XX:MaxPermSize=25m
-XX:MaxHeapFreeRatio=10
-XX:MinHeapFreeRatio=10
¿Qué GC es mejor en esta situación? ¿Se puede optimizar cualquiera de estas configuraciones para obtener el mejor rendimiento de la CPU y un uso mínimo de la memoria también?
EDITAR Para reconocer la pausa que grabo tiempo para escribir datos de audio en la línea de salida, por lo general es entre 92 a 120 ms (estoy escribiendo 16384 bytes = ~ 92ms), anuncio cuando se ejecuta completa GC, es más de 200 ms:
65.424: [Full GC (System) [PSYoungGen: 872K->0K(2432K)] [PSOldGen: 12475K->12905K(16960K)] 13348K->12905K(19392K) [PSPermGen: 15051K->15051K(22272K)], 0.2145081 secs] [Times: user=0.20 sys=0.00, real=0.21 secs]
Was writing 16384 bytes, time to write 263 ms
Edit2 patrón de asignación para mi aplicación es el siguiente: se carga montón de objetos en el inicio, a continuación, se inicia la reproducción y supongo que la mayoría de los objetos después de que se asignan por la interfaz gráfica de usuario, porque mirar/pausar el audio no cambia mucho el gráfico de GC. Esto es lo que visualgc muestra con gc paralelo:
El gráfico comienza en el inicio y comienzo la reproducción. Marcados se
1) de retardo de sonido y GC completa, creo que aumentó el tamaño antigua:
101.646: [Full GC [PSYoungGen: 64K->0K(6848K)] [PSOldGen: 15792K->12773K(19328K)] 15856K->12773K(26176K) [PSPermGen: 15042K->14898K(23808K)], 0.2411479 secs] [Times: user=0.19 sys=0.00, real=0.24 secs]
2) Abro la ventana de la aplicación y la pausa de reproducción. Nada realmente cambia, un poco más tarde aumenta el tamaño del edredón.
3) Abro las ventanas y comienzo de nuevo la reproducción.
¿Debo aumentar el tamaño de la antigua generación? ¿Cómo puedo hacer eso? Estoy corriendo con -XX: NewRatio = 10 y -XX: NewSize = 10m
Gracias.
Sí, tengo memoria limitada, es un reproductor de audio, y no debería usar más de 30-40 Mb. En general, mi montón está medio lleno. –
visualgc es una gran herramienta, gracias, he actualizado la pregunta con el gráfico visualgc. –