http://www.yourkit.com/download/index.jsp - единственный инструмент, который вам понадобится.
Вы можете делать снимки во время (1) запуска приложения и (2) после запуска приложения в течение N промежутков времени, затем сравнивая снимки, чтобы увидеть, где выделяется память. Он также сделает снимок на OutOfMemoryError, чтобы вы могли сравнить этот снимок с (1).
Например, последний проект, который мне пришлось устранить, вызвал исключения OutOfMemoryError, и после запуска YourKit я понял, что большая часть памяти фактически была выделена для некоторого класса ehcache "LFU", суть в том, что мы указали загрузки определенного POJO будет кэшироваться в памяти, но мы не указали достаточно -Xms и -Xmx (начальная и максимальная JVM-память).
Я также использовал Linux vmstat , например. некоторые платформы Linux просто не имеют достаточного количества подкачки или не выделяют смежные блоки памяти, и есть jstat (в комплекте с JDK).
ОБНОВЛЕНИЕ см. https://stackoverflow.com/questions/14762/please-recommend-a-java-profiler