Como monitorar o uso de memória Java?

Temos um aplicativo j2ee em execução no Jboss e queremos monitorar seu uso de memória. Atualmente usamos o seguinte código

    System.gc();
    Runtime rt = Runtime.getRuntime();
    long usedMB = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;
    logger.information(this, "memory usage" + usedMB);

Este código funciona bem. Isso significa que mostra a curva de memória que corresponde à realidade. Quando criamos um arquivo xml grande a partir de um DB, uma curva sobe, depois que a extração é concluída, ela desce.

Um consultor nos disse que chamar o gc () explicitamente está errado, "deixe o jvm decidir quando executar o gc". Basicamente, seus argumentos eram os mesmosdisscussed aqui. Mas ainda não entendi:

Como posso ter minha curva de uso de memória?o que está errado com o gc explícito ()? Eu não me importo com pequenos problemas de desempenho que podem acontecer com o gc explícito () e que eu estimaria em 1-3%. O que eu preciso é de memória e monitor de thread que me ajuda na análise do nosso sistema no site do cliente.

questionAnswers(13)

yourAnswerToTheQuestion