not leak exist example memory-leaks java-8 classloader permgen metaspace

memory-leaks - exist - memory leak java



¿Cómo diagnosticar una fuga de metaspacio Java 8? (2)

Tengo una aplicación J2EE con un comportamiento interesante ... el montón parece comportarse bien, creciendo y reduciéndose con las recolecciones de basura como se esperaba con el tiempo. No hay una expansión general acumulativa a largo plazo apreciable. Sin embargo, el metaspacio sigue creciendo a aproximadamente 20 Mb por hora hasta que alcanzamos MaxMetaspace y encontramos un OOME. He probado los recolectores de basura paralelos y G1 (jdk1.8.0_40).

La aplicación no se vuelve a implementar durante la ejecución, por lo que no parece que sea la fuga típica del cargador de clases. ¿Alguien tiene sugerencias sobre cómo localizar el origen de esta fuga?


Haga un volcado de pila y analícelo con Eclipse MAT . Mira las clases que has cargado. Compruebe si hay algo inesperado, especialmente las clases duplicadas. También tiene un explorador de carga de clases.

Edición: en teoría, también podría ser que estás generando proxies constantemente.


La causa principal de java.lang.OutOfMemoryError: Metaspace es:

  • ya sea demasiadas clases o
  • Clases demasiado grandes que se están cargando en el Metaspace.

Si desea volver a crear el problema, use este fragmento de código:

public class Metaspace { static javassist.ClassPool cp = javassist.ClassPool.getDefault(); public static void main(String[] args) throws Exception { for (int i = 0; ; i++) { Class c = cp.makeClass("eu.plumbr.demo.Generated" + i).toClass(); } } }

Todas esas definiciones de clase generadas terminan consumiendo Metaspace.

Javaassist en maven repo .

Puedes encontrar mucho más sobre OOME here