Наиболее вероятная причина того, что вы видите, состоит в том, что значения -Xms и -Xmx отличаются в вашем JAVA_OPTS. Похоже, что здесь происходит то, что ОС выделяет память при необходимости JVM. Нет ничего плохого в том, чтобы выделять всю кучу, которая понадобится JVM при запуске. Установите 2 значения на их верхний предел. Устанавливая два значения равными, JVM никогда не должна запрашивать память у ОС и может выполнять всю работу, которая ему необходима, в пределах своего собственного пространства памяти.
Нередко можно увидеть поведение, которое вы видели, JVM будет продолжать запрашивать больше памяти у ОС до тех пор, пока не будут достигнуты верхние пределы (-Xmx). Если вы новичок в определении размеров кучи или других методах настройки JVM, посмотрите это руководство .
С другой стороны, top и vmstat покажут вам только большую часть изображения того, что происходит с памятью JVM. То, что вы видите, это то, что операционная система выделяет для него. Вы захотите использовать другие инструменты, такие как jmap и jvisualvm , чтобы увидеть, как реагирует память внутри JVM. Эти инструменты станут лучшим эталоном для вашего приложения. Они покажут вам новое и старое поколения, сборщики мусора и другую статистику, которая действительно важна.