2010-03-01 6 views
8

Hemos pasado los últimos meses sintonizando nuestra aplicación de producción para que no experimentemos GC completos. Ahora solo experimentamos GC jóvenes, y la tasa de GC jóvenes depende de la tasa de asignación de objetos.¿Cuáles son los problemas con la preasignación de objetos en Java?

Nuestra aplicación necesita estar lo más cerca posible de "tiempo real", por lo que ahora estamos tratando de reducir el número de GC jóvenes. Como dice el viejo axioma, la mayoría de los datos que asignamos terminan siendo basura y descartados en el próximo joven GC. Por lo tanto, no es necesario preasignar para este tipo de datos. Sin embargo, hay una buena cantidad de objetos (definidos por tipo) que sabemos que pasarán de un GC joven a un CG antiguo.

¿Tendría sentido preasignar estos objetos durante tiempos más ideales (es decir, al inicio) por lo que terminaremos asignando menos durante nuestros tiempos menos que ideales? He leído la literatura que menciona cómo no se recomienda la agrupación de objetos con las últimas JVM porque la asignación es mucho más económica. ¿Cuáles son los inconvenientes de preasignar objetos que sé que llegarán al antiguo GC?

+3

No sé cómo alguien puede ayudarlo con eso, ya que la respuesta es, muy probablemente, muy, muy dependiente de su código concreto y de la plataforma en la que se ejecuta. Haz una evaluación y verás. –

+0

No es troll, pero si estás preocupado por la gestión de memoria, ¿no deberías codificar lo maldito en C++? –

+6

o utiliza una JVM especialmente diseñada para tiempo real –

Respuesta

3

Al reducir la tasa de asignación, las "pausas" del GC son menos frecuentes, pero no más cortas. Para una operación "en tiempo real" más suave, es posible que desee aumentar el número de invocaciones de GC: esto es intercambiar más CPU relacionada con GC para obtener pausas más cortas. La JVM de Sun se puede sintonizar con varios options; Sugiero probar -XX:NewRatio para hacer que la generación joven sea más pequeña.

El argumento habitual contra la agrupación es que básicamente intenta escribir su propio asignador, con la esperanza de que haga un mejor trabajo que el asignador de JVM. Está justificado en algunos casos específicos donde la asignación es costosa, p. creando Thread instancias.

3

Solo una nota de que hay un realtime jvm disponible. Si su aplicación necesita un rendimiento predecible, vale la pena investigarla.

Cuestiones relacionadas