Ответ 1
Вы используете Parallel GC, у которого есть адаптивная политика размера по умолчанию.
Установите -XX:-UseAdaptiveSizePolicy
если вы не хотите изменять размеры кучи.
У нас есть приложение Java, работающее в openjdk8, чья максимальная память кучи изменяется во время выполнения - что может быть причиной этого?
Я нашел вопрос Почему куча меняется в java, которая указывает на статью, которая объясняет разницу между max
и committed
памятью. Кажется, что в нашем случае эти два, как правило, одни и те же, но не всегда - см. В 11:53 на скриншотах ниже.
Куча также может быть изменена на последовательный сборщик молодого поколения (-XX:MaxHeapFreeRatio
, см. Поощрение JVM к GC, а не рост кучи?), Однако мы используем параллельный коллектор, поэтому это не так.
Параметры JVM, связанные с памятью, с которыми мы запускаем приложение:
-XX:MaxMetaspaceSize=200M -Xms2000m -Xmx2000m
Не уверен, что это связано, приложение выполняло параллельную разметку в старых поколениях между 11:55 и 11:58 - в это время было доступно более 200 МБ свободной памяти, и мы не можем видеть никаких причин этого поведения.
Вы используете Parallel GC, у которого есть адаптивная политика размера по умолчанию.
Установите -XX:-UseAdaptiveSizePolicy
если вы не хотите изменять размеры кучи.