2011-03-28 20 views
8

Para sintonizar el Java 6 (1.6.0_23) GC, utilizo -XX:+UseParallelOldGC junto con¿Cómo puedo hacer que la antigua región cambie el tamaño de forma adaptativa en Java GC?

-XX:+PrintTenuringDistribution 
-XX:+UseAdaptiveSizePolicy 
-XX:+UseAdaptiveGCBoundary 

Mi objetivo es dejar que el GC calcular una relación óptima entre las regiones antiguas y nuevas. Sin embargo, visualgc (jvmstat 3.0) muestra que, si bien la relación entre el eden y los supervivientes se modifica de acuerdo con mi carga de trabajo, la región anterior permanece (desesperadamente) en su tamaño inicial, fijado por newRatio (2 en mi caso).

¿Qué hay de malo en mi configuración o mis expectativas?

En mi pantalla, después de 19 colecciones, visualgc muestra la antigua generación constantemente bajo 500 m , mientras que los tamaños reservados y confirmados de la antigua generación son 624 m. He configurado NewSize a 30 my MaxNewSize a 300 m, pero esto no cambia nada: NewRatio parece intangible ... PrintAdaptiveSizePolicy solo habla de sobreviviente.

El punto es que el menú "espacio reservado" de visualgc no muestra nada por el espacio Antiguo Gen ... He tryed también en el uso de -XX: + UseAdaptiveGCBoundary sin ningún cambio.

Éstos son algunos registros -XX:+PrintTenuringDistribution -XX:+PrintGCDetails

Hay un total GC, y la impresión final del montón ... Parece que la distribución tenured es ilegible, también ...

Desired survivor size 119275520 bytes, new threshold 1 (max 15) 
[PSYoungGen: 182096K->66576K(233024K)] 681978K->631994K(932096K), 0.2582390 secs] [Times: user=0.29 sys=0.00, real=0.26 secs] 
116.431: [GC 
Desired survivor size 119275520 bytes, new threshold 1 (max 15) 
[PSYoungGen: 183120K->39952K(233024K)] 748538K->670910K(932096K), 0.1578620 secs] [Times: user=0.29 sys=0.00, real=0.16 secs] 
116.589: [Full GC [PSYoungGen: 39952K->0K(233024K)] [ParOldGen: 630958K->310429K(699072K)] 670910K->310429K(932096K) [PSPermGen: 21973K->21973K(30592K)], 1.3326720 secs] [Times: user=1.79 sys=0.01, real=1.33 secs] 
118.050: [GC 
Desired survivor size 119275520 bytes, new threshold 1 (max 15) 
[PSYoungGen: 116544K->18448K(233024K)] 426973K->328877K(932096K), 0.0745320 secs] [Times: user=0.14 sys=0.00, real=0.08 secs] 
118.234: [GC 
Desired survivor size 119275520 bytes, new threshold 1 (max 15) 
[PSYoungGen: 134992K->24592K(233024K)] 445421K->351409K(932096K), 0.1290960 secs] [Times: user=0.14 sys=0.00, real=0.13 secs] 
118.526: [GC 
Desired survivor size 114884608 bytes, new threshold 1 (max 15) 
[PSYoungGen: 141136K->36880K(237312K)] 467953K->380085K(936384K), 0.1187320 secs] [Times: user=0.21 sys=0.00, real=0.12 secs] 
118.759: [GC 
Desired survivor size 108593152 bytes, new threshold 1 (max 15) 
[PSYoungGen: 142446K->40976K(233024K)] 485652K->416957K(932096K), 0.1153230 secs] [Times: user=0.23 sys=0.00, real=0.12 secs] 
Heap 
PSYoungGen total 233024K, used 97957K (0xb3a40000, 0x9e4f0000, 0x9e4f0000] 
eden space 120832K, 47% used [0x9e4f0000,0xa1c95668,0xa5af0000) 
from space 112192K, 36% used [0xa5af0000,0xa82f4020,0xac880000) 
to space 106048K, 0% used [0xad2b0000,0xad2b0000,0xb3a40000) 
ParOldGen total 699072K, used 375981K [0x73a40000, 0x9e4f0000, 0x9e4f0000) 
object space 699072K, 53% used [0x73a40000,0x8a96b730,0x9e4f0000) 
PSPermGen total 30592K, used 21981K [0x6fa40000, 0x71820000, 0x73a40000) 
object space 30592K, 71% used [0x6fa40000,0x70fb7668,0x71820000) 
+0

Mi comprensión es que el tamaño fijo aumenta con el uso aumentado. No esperaré que crezca mucho una vez que la aplicación haya alcanzado un uso estable de la memoria (posiblemente muy rápido) –

+0

¿ha hecho alguna colección anterior durante este período? Creo que solo cambia el tamaño de viejo una vez que ha hecho algunos de ellos. Puede usar 'PrintAdaptiveSizePolicy' y verbosegc para que pueda ver lo que está haciendo en detalle. – Matt

+0

No mencionó qué está haciendo su programa, pero si se trata de un servidor, por experiencia personal recomendaré que lo cargue (pruebe) y sintonice los valores de GC para obtener el rendimiento que desea. Olvídese de cualquier cosa dinámica, es mejor tener algo que sea algo derrochador pero conocido, bueno a plena carga. –

Respuesta

3

¿Cómo puedo hacer que la antigua región cambie el tamaño de forma adaptativa en Java GC?

No creo que sea posible. El GC tiene un conjunto limitado de "botones de ajuste", y no puedo ver uno que haga esto por usted. Mi sensación es que estás "pensando demasiado" sobre el problema.

Referencia:

Si esta respuesta no es lo suficientemente bueno, sus opciones son bastante limitadas:

  • Si pasó por los canales apropiados y estaba dispuesto a desembolsar algo de dinero, probablemente podría obtener ayuda de un experto en ajuste de Oracle .

  • Si tiene el tiempo y la paciencia, podría tratar de entender el código fuente de GC en la base de código OpenJDK.

Cuestiones relacionadas