portable para opencobol open java performance garbage-collection

java - para - Long GC hace una pausa en la aplicación



opencobol para windows (4)

Actualmente estoy ejecutando una aplicación que requiere un tamaño máximo de almacenamiento dinámico de 16 GB.

Actualmente utilizo los siguientes indicadores para manejar la recolección de basura.

-XX/:+UseParNewGC, -XX/:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=50, -XX/:+DisableExplicitGC, -XX/:+PrintGCDateStamps, -XX/:+PrintGCDetails, -Xloggc/:/home/user/logs/gc.log

Sin embargo, he notado que durante algunas recolecciones de basura, la aplicación se bloquea durante unos segundos y luego continúa. Esto es completamente inaceptable ya que es un servidor de juegos.

Puede encontrar un ejercicio de mis registros de recolección de basura aquí .

Cualquier consejo sobre lo que debería cambiar para reducir estas largas pausas sería muy apreciado.


Cualquier consejo sobre lo que debería cambiar para reducir estas largas pausas sería muy apreciado.

Lo más probable es que el CMS GC no pueda seguir el ritmo de la cantidad de basura que genera su sistema. Pero el trabajo que el GC tiene que realizar está realmente más relacionado con la cantidad de basura que su sistema conserva.

Asi que ...

  • Intente reducir el uso real de memoria de su aplicación; por ejemplo, no guardando en la memoria caché tantas cosas, o reduciendo el tamaño de tu "mundo".
  • Intenta reducir la velocidad a la que tu aplicación genera basura.
  • Actualice a una máquina con más núcleos para que haya más núcleos disponibles para ejecutar los subprocesos GC paralelos cuando sea necesario.

Para Mysticial:

Sí, en retrospectiva, podría haber sido mejor implementar el servidor en C ++. Sin embargo, no sabemos nada sobre "el juego". Si se trata de un modelo mundial complicado con estructuras de datos heterogéneas complicadas, implementarlo en C ++ podría significar que se reemplaza el problema de "pausa del GC" con el problema de que el servidor se cuelga todo el tiempo debido a problemas con la forma en que gestiona sus datos estructuras.


¿Qué versión de java estás usando? http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html Para intentar minimizar el uso de variables de instancia en una clase. Sería mejor realizar en variables locales que en la instancia varibles. Ayuda a obtener el rendimiento y a evitar el problema de sincronización. Al final de la operación antes de la salida del programa, siempre reinicie las variables utilizadas si está utilizando variables de instancia y vuelva a establecerlas cuando sea necesario. Ayuda más en la mejora del rendimiento. Además de la versión de Java, se implementa una buena política de recolección de basura. Sería mejor pasar a la nueva versión si eso es posible. También puede controlar el tiempo de pausa del recolector de basura a través de VisualVm y puede tener más idea de cuándo está realizando más recolección de basura.


No soy un experto en la recolección de basura de Java, pero parece que está haciendo lo correcto al usar el recopilador simultáneo (el indicador UseConcMarkSweepGC), suponiendo que el servidor tiene múltiples procesadores. Siga las sugerencias para solucionar problemas en http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#cms . Si ya lo has hecho, cuéntanos qué pasó cuando los probaste.


Al mirar tus registros, no veo pausas largas. Pero el joven GC es muy frecuente. La tasa de promoción es muy baja (la mayoría de la basura es eliminada por el joven GC como debería). Al mismo tiempo, su anterior utilización de espacio es baja.

Por cierto, ¿estamos hablando del servidor de Minecraft?

Para reducir la frecuencia de los jóvenes GC, debe aumentar su tamaño. Sugeriría comenzar con -XX:NewSize=8G -XX:MaxNewSize=8G

Para un espacio tan grande y joven, también debes reducir el tamaño del espacio del superviviente -XX:SurvivorRatio=512

La sintonización de GC es una ruta de prueba y errores, por lo que puede necesitar más iteraciones y ajustes.

Puede encontrar algunos artículos útiles en mu blog