Анализ потребления памяти приложением Java не должен выполняться с использованием инструментов ОС, ИМХО. Работающая JVM выделит объем памяти и вряд ли освободит его, даже если JVM на самом деле не нужен в данный момент времени. Инструмент ОС сообщит только объем памяти, выделенный JVM, а не объем памяти, фактически выделенный в JVM.
Инструменты, поставляемые с JDK (jstat, jconsole, jvisualvm), гораздо более надежны. При интерпретации использования памяти самым важным является размер фактической кучи. Java-приложение обычно отображает пилообразный шаблон. Количество используемой кучи будет постепенно увеличиваться со временем и резко уменьшаться, когда GC освобождает пространство кучи, удаляя все ненужные объекты.
Определенным предупреждающим сигналом является медленно поднимающийся пилообразный сигнал: резкое падение, вызванное ГХ, каждый раз заканчивается немного выше. Если приложение выполняется в течение длительного времени (обычно для серверного приложения), это, скорее всего, приведет к ошибке OutOfMemory в долгосрочной перспективе.
Еще одна вещь, которую нужно искать, это пилообразная пила, в которой «зубы» становятся острее и выше. Это также указывает на то, что приложению со временем потребуется все больше и больше памяти.
Если вы хотите проанализировать основную причину обнаруженной проблемы, вам нужно проанализировать количество созданных объектов и посмотреть, как долго они живут. Это не тривиальные вещи.