Ralentización del rendimiento en Java 7

El rendimiento de AEM en Java 7 disminuye repentinamente y los volcados de subprocesos no muestran evidencia de un subproceso culpable. Muchos subprocesos están en estado Ejecutable y llevando a cabo parte de los códigos que se sabe que no tienen ningún defecto.

La causa principal de este problema es que Java 7 sufre el problema de CodeCache descrito en esta preguntas y respuestas del desbordamiento de pila.

En resumen, “En Java 7, una vez que CodeCache se llena, el JIT se detiene. Entonces, casi un tercio del área de CodeCache se vacía, pero, luego, el JIT no se vuelve a habilitar.”

Este escenario resulta en una ejecución mucho más lenta del código Java que fue desalojado de la caché de código o que nunca fue ejecutado por JVM. Por lo tanto, algunas solicitudes que solo llegan a código compilado JIT seguirán respondiendo con los tiempos de respuesta habituales, mientras que otras peticiones tardarán mucho más tiempo.

Solución: actualizar la versión de Java o desactivar el vaciado de la caché de código

Hay tres soluciones posibles:

  • Actualice a Java 8, que no se ve afectado por este problema de rendimiento. Esta es la solución más segura.
  • Actualizar a Java 1.7.0_101-b14, que requiere soporte SE Java de Oracle, ya que Java 7 está en el final de vida útil desde Mayo del 2015
  • Deshabilite el vaciado de la caché de código y aumente el tamaño de la caché añadiendo los siguientes argumentos de JVM en el script de inicio de AEM:
    • -XX:-UseCodeCacheFlushing
    • -XX:ReservedCodeCacheSize=90M

Estos argumentos especifican un tamaño de caché de código de 90 MB (en lugar de los 48 MB predeterminados) y desactivan el vaciado de la caché de código, de modo que si la caché de código se desborda, el código existente no se está ejecutando en modo de intérprete (solo el código nuevo no se compila). Supervise el tamaño de la caché de código durante algún tiempo (por ejemplo, utilizando jconsole) para asegurarse de que el valor máximo configurado no sea demasiado bajo. Tenga en cuenta que después de actualizar a Java 8, debe eliminar esta configuración.