Encontre vazamento de memória nativa no aplicativo Java usando JeMalloc

Atualmente, estou tentando resolver um problema de memória Java: Meu aplicativo Java continua usando cada vez mais memória e, eventualmente, é eliminado pelo assassino do Linux OOM.

Provavelmente, há um vazamento de memória nativa, porque após a inspeção da JVM com o VisualVM, o metasspace e o heap parecem OK.

Utilizando o comando top, vejo que a memória usada pela JVM continua aumentando.

O primeiro gráfico deste artigo:

Exemplo 1

É uma combinação perfeita do que estou vendo no meu próprio aplicativo.

Então, tentei usar o JeMalloc para encontrar o vazamento, conforme descrito em vários artigos. Aqui me deparei com um problema: Ao usar o comando jeprof e, mais tarde, o comando top no próprio jeprof, ele mostra as funções que usam mais memória, mas estas estão em endereços hexadecimais, portanto, devo estar perdendo alguns símbolos. Mas não sei de quais pacotes preciso para isso, que é desconhecido para mim.

Eu já encontrei este link:Link # 1

E instalou este pacote: debuginfo-install java-1.8.0-openjdk

Tentei trabalhar com etapas simples primeiro:

Faça com que o JeMalloc trabalhe com um aplicativo simples, como w. Em seguida, faça-o funcionar com a versão java. Até aqui tudo bem, também posso obter PDFs do JeMalloc com uma visão geral perfeita.

Em seguida, faça-o funcionar com java -jar simpletest.jar << Aqui estão faltando símbolos Por exemplo, se eu não fechar um GZipInputStream aqui, isso não aparecerá nos resultados do JeMalloc.

Em seguida, faça-o funcionar com java -jar myapplication.jar << Aqui também estão faltando símbolos.

Portanto, minha pergunta é basicamente: De quais pacotes eu preciso para fazer com que o JeMalloc exiba todos os nomes de símbolos para aplicativos de depuração, 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();
    }*/
  }
}

Usando o seguinte software:

Linux CentOS 7JeMallocOpenJDK

Artigos encontrados:

Artigo 1

Artigo 2

Artigo nº 3

Artigo 4

questionAnswers(1)

yourAnswerToTheQuestion