Por que meu tamanho de despejo de heap Java é muito menor que a memória usada?

Problema

Estamos tentando encontrar o culpado de um grande vazamento de memória em nosso aplicativo da web. Temos uma experiência bastante limitada em encontrar um vazamento de memória, mas descobrimos como fazer um dump de heap java usandojmap e analise-o no Eclipse MAT.

No entanto, com nosso aplicativo usando 56/60 GB de memória, o heap dump tem apenas 16 GB de tamanho e é ainda menos no Eclipse MAT.

Contexto

Nosso servidor usa o Wildfly 8.2.0 no Ubuntu 14.04 para nosso aplicativo java, cujo processo usa 95% da memória disponível. Ao fazer o dump, o espaço usado em nossos buffers / cache estava em 56 GB.

Usamos o seguinte comando para criar o dump:sudo -u {application user} jmap -dump:file=/mnt/heapdump/dump_prd.bin {pid}

O tamanho do arquivo de despejo de heap é 16,4 GB e, ao analisá-lo com o Eclipse MAT, ele diz que existem cerca de 1 GB de objetos ativos e ~ 14,8 GB de heap inacessível / raso.

EDITAR: Aqui estão mais algumas informações sobre o problema que vemos acontecendo. Monitoramos nosso uso de memória e vemos que ele cresce e cresce, até que haja ~ 300mb de memória livre restante. Em seguida, ele permanece em torno dessa quantidade de memória, até o processo travar, infelizmente sem erros no log do aplicativo.

Isso nos leva a supor que se trata de um erro grave do OOM, porque isso só acontece quando a memória está quase esgotada. Nós usamos as configurações-Xms25000m -Xmx40000m para a nossa JVM.

Pergunta, questão

Basicamente, estamos nos perguntando por que a maior parte de nossa memória não é capturada nesse despejo. As principais classes de tamanho retido não parecem muito suspeitas; portanto, estamos nos perguntando se há algo relacionado ao despejo de heap que estamos fazendo de errado.

questionAnswers(2)

yourAnswerToTheQuestion