Почему максимальная куча меняется во время выполнения?

У нас есть приложение Java, работающее в openjdk8, чья максимальная память кучи изменяется во время выполнения - что может быть причиной этого?

Я нашел вопрос Почему куча меняется в java, которая указывает на статью, которая объясняет разницу между max и committed памятью. Кажется, что в нашем случае эти два, как правило, одни и те же, но не всегда - см. В 11:53 на скриншотах ниже.

Куча также может быть изменена на последовательный сборщик молодого поколения (-XX:MaxHeapFreeRatio, см. Поощрение JVM к GC, а не рост кучи?), Однако мы используем параллельный коллектор, поэтому это не так.

Параметры JVM, связанные с памятью, с которыми мы запускаем приложение:

-XX:MaxMetaspaceSize=200M -Xms2000m -Xmx2000m

Не уверен, что это связано, приложение выполняло параллельную разметку в старых поколениях между 11:55 и 11:58 - в это время было доступно более 200 МБ свободной памяти, и мы не можем видеть никаких причин этого поведения.

Heap Memory Mark Sweep Count

Ответ 1

Вы используете Parallel GC, у которого есть адаптивная политика размера по умолчанию.
Установите -XX:-UseAdaptiveSizePolicy если вы не хотите изменять размеры кучи.