Buscar pérdida de memoria nativa en la aplicación Java utilizando JeMalloc

Actualmente estoy tratando de resolver un problema de memoria Java: mi aplicación Java sigue usando más y más memoria y, finalmente, el asesino OOM de Linux la mata.

robablemente haya una pérdida de memoria nativa, porque después de la inspección de la JVM con VisualVM, tanto el metaespacio como el montón se ven bien.

Usando el comando superior puedo ver que la memoria utilizada por la JVM sigue aumentando.

El primer gráfico de este artículo:

Ejemplo

Es una combinación perfecta de lo que estoy viendo en mi propia aplicación.

Entonces intenté usar JeMalloc para encontrar la fuga como se describe en varios artículos. Aquí me encuentro con un problema: cuando uso el comando jeprof y luego el comando top en jeprof, muestra las funciones que usan más memoria, pero estas están en direcciones hexadecimales, por lo que me faltan algunos símbolos. Pero no sé qué paquetes necesito para eso, eso me es desconocido.

Ya encontré este enlace:Link # 1

E instalé este paquete: debuginfo-install java-1.8.0-openjdk

Intenté trabajar primero con pasos simples:

Obtenga JeMalloc para trabajar con una aplicación simple, como w. Luego haga que funcione con java -version. Hasta ahora todo bien, también puedo obtener archivos PDF de JeMalloc con una descripción perfecta.

Next haga que funcione con java -jar simpletest.jar << Aquí me faltan símbolos Por ejemplo, si no cierro un GZipInputStream aquí, eso no se muestra en los resultados de JeMalloc.

Next haz que funcione con java -jar myapplication.jar << Aquí también me faltan símbolos.

Así que mi pregunta es básicamente: ¿Qué paquetes necesito para que JeMalloc muestre todos los nombres de símbolos para depurar aplicaciones como:

public void test1() {
    InputStream fileInputStream = null;
    GZipInputStream gzipInputStream = null;

    try {
      fileInputStream = new FileInputStream("test.zip");
      gzipInputStream = new GZIPInputStream(fileInputStream);

      int data = gzipInputStream.read();
      while (data != -1) {
        // do something with data
        data = gzipInputStream.read();
      }

    } catch (Exception ex) {

    } finally {
      // Disabled to see whether JeMalloc can detect the leak
      /*try {
        if (gzipInputStream != null) {
          gzipInputStream.close();
        }
        if (fileInputStream != null) {
          fileInputStream.close();
        }

        gzipInputStream = null;
        fileInputStream = null;
      } catch (IOException e) {
      e.printStackTrace();
    }*/
  }
}

Utilizando el siguiente software:

Linux CentOS 7 JeMalloc OpenJDK

Artículos encontrados:

Articulo

Artículo

Artículo # 3

Artículo # 4

Respuestas a la pregunta(1)

Su respuesta a la pregunta