G1 не позволяет выделить большой объект, а Parallel позволяет

openjdk 11.0.14.1 2022-02-08

Рассмотрим следующую простую программу на Java.

public static void main( String[] args ){
    int i[] = new int[Integer.MAX_VALUE / 2];
}

Здесь int имеет размер 4 байта, поэтому для выделения int[Integer.MAX_VALUE / 2] требуется 4G свободного размера кучи. Теперь запустим программу с разными опциями.

Я.-XX:+UseParallelGC -Xmx5g

Результат: Сбой с OutOfMemoryError.

Даже несмотря на то, что размер кучи достаточно велик. Это понятно, так как -XX:NewSize по умолчанию является 1310 MB, а старое поколение недостаточно велико.

II.-XX:+UseParallelGC -Xmx5g -XX:MaxNewSize=128m -XX:NewSize=128m

Результат: Завершено нормально

Приложение работает нормально, поскольку старое поколение достаточно велико, чтобы вместить выделение массива.

Теперь давайте изменим коллектор с Parallel на G1

III.-XX:+UseG1GC -Xmx5g -XX:MaxNewSize=128m -XX:NewSize=128m

Результат: Сбой с OutOfMemoryError.

И это то, о чем я понятия не имею. Я думал, что настройка -XX:G1HeapWastePercent поможет, но это не так.

Почему G1 не удерживает выделение массива и какие параметры настроить, чтобы это исправить?

Вы пробовали более новый JDK? Вроде в последней версии проблем нет.

boneill 23.04.2022 05:09
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
1
1
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это ошибка JVM JDK-8279241 "G1 Full GC не всегда перемещает память по нижним адресам". Это должно быть решено в JDK 19.

Обходной путь — отключить общий доступ к данным класса. Тест не проваливается с -Xshare:off

Другие вопросы по теме