universidades tesis solidos sobre residuos que problemas por plan manejo libros las hacer desechos contaminacion como clasificacion causa calles basura java garbage-collection performance

java - tesis - ¿Alguien ha encontrado que la optimización de la recolección de basura es útil?



tesis sobre contaminacion por residuos solidos (6)

Debo decir que no he tenido la necesidad de usar la sintonía mucho. Pero trabajo estrechamente con personas que escriben código donde la latencia es crítica: hacen mucho uso de tal ajuste, especificando qué algoritmo GC usar, tiempos de pausa máximos, relaciones de supervivencia, etc.

Por lo tanto, creo que la respuesta es: si la latencia es crítica para una aplicación, es posible que tenga que ver cómo ajustar su GC

He leído muchos artículos sobre la optimización de GC en Java y, a menudo, me he preguntado cuántas personas realmente utilizan algunas de las funciones más avanzadas.

Siempre he evitado la sintonización en la medida de lo posible y me he concentrado en escribir el código más simple posible que pueda (el consejo de Brian Goetz); parece que hasta ahora me ha funcionado bien.

¿Estas estrategias de ajuste son resistentes al cambio en las versiones de VM o requieren una reevaluación constante?

El único ajuste que he utilizado es el indicador -server.


En resumen, sí, es muy útil para ajustar cualquier aplicación Java seria. A menudo hemos encontrado que en los escenarios de producción es la diferencia entre una aplicación estable y una aplicación completamente impredecible. Ciertamente no es lo primero que hago, pero una vez que tienes una aplicación funcionando y puedes aplicarle una carga real, es una de las primeras cosas que debes investigar en ese momento.


La gran mayoría de los desarrolladores nunca tendrán que (o querrán) ajustar GC. He trabajado con personas que han tenido que sintonizarlo y aquí está el consejo:

Antes de intentar ajustar el recolector de basura, asegúrese de que haya verificado al 100%, con un generador de perfiles. Que esta pasando. Una vez que empiece a sintonizar, asegúrese de verificar, con un perfilador, que tuvo un efecto positivo.

También debe revisar los cambios con cada versión de la máquina virtual en la que se ejecuta (las máquinas virtuales diferentes tendrán diferentes estrategias de ajuste).

Una vez ayudé a alguien con un problema de GC que resultó que no cerraban los conjuntos de resultados de JDBC (o algún problema como ese). Esto causó que la memoria nunca fuera liberada (su código se mantuvo en ellos por alguna razón). Arreglar ese problema hizo que el programa pasara de 20 minutos a algo así como 30 segundos o un par de minutos. El uso de la memoria se redujo también.


Parte de mi trabajo actual es el cuidado y la alimentación de una gran aplicación java que fue diseñada para ejecutarse con una gran cantidad de memoria (actualmente alrededor de 8 Gb), principalmente debido a los cálculos en curso con una gran cantidad de datos almacenados en caché. Hice la implementación inicial con la configuración estándar de GC, principalmente porque no había una manera simple de simular el entorno de producción ejecutándose a toda velocidad.

En etapas, durante los próximos meses, he personalizado la configuración de GC. En general, la perilla más grande disponible parece estar ajustando la frecuencia y la magnitud de la Gc incremental; la mayor mejora ha sido cambiar la Gc periódica grande por una más pequeña y más frecuente. Pero definitivamente hemos podido ver mejoras en el rendimiento.

No voy a publicar mis configuraciones específicas porque a) son específicas de nuestra configuración, yb) porque no las tengo a mano :). Pero en general, lo que he encontrado es

  • Se ha trabajado mucho para ajustar la configuración predeterminada de gc. Casi siempre los valores predeterminados funcionan mejor que cualquier ajuste que yo haría.
  • Al menos para mí, las situaciones en las que la sintonización de gc realmente valía la pena eran tan extremas que no era razonable intentar simularlas, así que tuve que hacerlo de manera experimental e incremental.

Here''s una buena referencia de un anterior. discusión de .


Yo diría que lo más común para sintonizar es el tamaño máximo de memoria. La mayoría de las otras opciones de memoria tienen valores predeterminados razonables y, a menudo, se ajustan de manera excepcional. Es decir, establecer cuando realmente no hace mucha diferencia. A menudo veo que las personas establecen muchas opciones cuando la mitad de ellas son las predeterminadas en cualquier caso. ;)

Usar un generador de perfiles es la forma más útil de mejorar el comportamiento del GC (al reducir la cantidad de objetos creados)


Tengo pero no recientemente. La aplicación en la que estaba trabajando era la representación en tiempo real de un flujo de video construido con imágenes JPEG de movimiento individuales. En ese momento (alrededor de JDK 1.2 y 1.3), la configuración -Xincgc cambiaría al recolector de basura del cliente de una limpieza de big bang a un modo en el que se limpiaba un poco de basura regularmente. Como resultado, la distribución de las latencias de cuadros fue mucho menor, lo que da la impresión de un video más suave (en lugar de 1-2-3-pausa, 1-2-3-pausa).

No he mirado ese código en mucho tiempo, pero sospecho fuertemente que, con los algoritmos modernos de recolección de basura, -Xincgc realidad disminuiría el rendimiento.

En el mundo de hoy, diría que el escepticismo de la optimización estándar siempre debería aplicarse: perfil perfil. ¿Está seguro de que el cuello de botella es realmente el recolector de basura ...?