2009-10-18 8 views
17

Desde que cambié a JRE 6, el uso de caché de código de mi servidor (sin almacenamiento dinámico) sigue creciendo indefinidamente. Mi aplicación crea muchas clases en tiempo de ejecución, PERO estas clases se descargan con éxito durante el proceso de GC. Veo que estas clases se descargan en los registros de gc y también el uso de permGen se mantiene constante. Específicamente me aseguro en mi código de que estas clases sean huérfanas una vez que haya terminado con ellas y que reciban correctamente la basura recolectada de permGen.¿Qué causa una fuga de caché de código JRE 6 JVM?

Sin embargo, el caché de código sigue creciendo. Solo me di cuenta de la caché del código después de cambiar a JRE 6. Así que supongo que mis preguntas son:

  1. ¿Incluye GC el caché del código?
  2. Lo que podría causar una fuga de memoria de caché de código, específicamente.
  3. ¿Hay algún error en JDK 6 en esta área?
+0

¿Ha intentado limitar el tamaño máximo con el -XX: ReservedCodeCacheSize bandera de tiempo de ejecución? – serg10

+0

Hola. sí lo tengo, solo pospone lo inevitable. Supongo que estoy tratando de entender para qué se usa el caché de código y cómo en su código puede causar una pérdida de memoria en esta área específica de la arquitectura de memoria JVM. Todos los otros segmentos de memoria JVM obtienen basura recolectada y son estables. Es solo el caché de código que está aumentando indefinidamente y no sé por qué. Gracias. –

+0

¿Está utilizando un servidor de aplicaciones para ejecutar su código o ejecutarlo directamente? – GaZ

Respuesta

0

¿Es posible invocar jvisualvm (en el JDK) contra la aplicación problemática? Puede fácilmente hacerte mucho más sabio sobre lo que está sucediendo.

+0

Uso jconcole que me dice todo lo que necesito. Sé que el caché del código está creciendo indefinidamente. Estoy tratando de ver por qué, ninguna visualización del código JVM me dirá que supongo? Gracias por tu comentario. –

1

Es posible que desee mirar a través de esta discusión y sólo tiene que ir hacia atrás para ver lo que puede ser útil para tratar de reducir esta abajo: http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2009-January/000530.html

Ésta implica JDK5 pero puede ser útil: http://www.nabble.com/Java-code-cache-memory-td22202283.html

¿Estás usando esto para compilar páginas jsp, o algo similar? Si no, ¿qué se compila después de que se inicia la aplicación? ¿Estás usando AspectJ con el tejido en tiempo de ejecución?

Ayudaría saber lo que está haciendo para tener una mejor idea de cómo ayudar.

Además, cuando el caché del código está agotado, ¿simplemente deja de compilar de nuevo o se bloquea el jvm? Yo esperaría lo primero.

¿Está utilizando Sun's JDK? Supongo que lo es porque dudo que los demás estén en la lista como versión 6, pero no está de más preguntar.

+0

Gracias. Estoy usando plantillas de velocidad para generar y compilar código java periódicamente en el sistema. Usamos un sistema en el que la configuración del sistema se especifica en las hojas de cálculo de Excel y cuando el usuario cambia las hojas de cálculo de Excel, volvemos a generar el código Java en función de la configuración y la compilación en tiempo de ejecución, desde el sistema. Por lo tanto, tenemos múltiples versiones de código java. Sé que estas versiones están obteniendo gc'd de permGen ya que puedo verlo en los registros de gc. La JVM falla, pero es problemática debido a los malos argumentos de JVM. Sí, usando JDK 6. Veremos enlaces, gracias. –

1

Me preguntaba si el nuevo G1 Garbage Collector (a partir de Java 6 actualización 14) podría ayudarlo. Puede intentarlo con -XX: + UnlockExperimentalVMOptions -XX: + UseG1GC, pero de acuerdo con comments on Jon Masamitsu's blog no lo hará (si el problema se debe realmente a la memoria caché del código). Pero tal vez la discusión allí o los enlaces de allí podrían ayudar.

1

A partir de los comentarios en esta entrada del blog: http://blogs.oracle.com/jonthecollector/entry/our_collectors

código es desalojado cuando se descargan las clases (como así, como cuando los métodos son "invalidado", es decir, algunos supuestos se hicieron durante su compilación que no aguantar más)

si yo fuera tú, correría una carga de trabajo, tomaría un montón de archivos y verificaría si todas las clases son de GCC que usted espera.

1

Dos posibles lugares en los que buscaría el problema: Pérdida de cargadores y Massive String.

Desde la descripción de su aplicación, es más probable que verifique si el GC está descargando clases viejas generadas.

No creo que jConsole tenga una forma de visualizar esto, pero si puede obtener una copia de YourKit, tiene una forma gráfica de detectar ambos problemas.

+2

¿Cómo interferiría la cadena masiva con la caché del código? Las cadenas se almacenan en el generador de perm y la memoria caché de código es una región separada. – Puneet

Cuestiones relacionadas