Я пишу простую программу на Java, чтобы создать 2 массива int размером 1 миллиард.
Я запустил эту программу с -Xms10G, т. Е. 10 ГБ памяти все равно я получил ошибку OOM.
Ниже приведен фрагмент.
public class TestBigIntArraySize {
public static int arraySize = 1000_000_000;
public static int [] firstArray = new int[arraySize];
public static int [] secondArray = new int[arraySize];
public static void main(String[] args) {
System.out.println(1000_000_000 * Integer.SIZE);
}
}
Насколько я могу судить, память, используемая для массива 1 млрд. Int, будет System.out.println (1000_000_000 * Integer.SIZE);
который возвращает 1 935 228 928, что меньше, чем 2 ГБ. Таким образом, общие требования к моим программам будут не более 4 ГБ.
Я получаю ошибку, даже если я создаю массивы в вызове метода и возвращаю массив или статический (как показано ниже) или внутри main ().
Память, которая требуется для его работы, составляет 12G, что в 3 раза больше, чем я ожидал.
Я использую Oracle Java: jdk1.8.0_201
Я попробовал опцию -Xms10G -XX: NewRatio = 1 ---, которая работала.
Но я хочу уменьшить объем памяти.
Я попытался добавить больше памяти для eden -Xms9G -XX:NewRatio=0.5
, но java жалуется на недопустимый аргумент.
Я попробовал вариант прямого выделения массива для старого поколения -Xms9G -XX:NewRatio=1 -XX:PretenureSizeThreshold=10000
. Но это также дает OOM.
Это просто экспериментальный проект, и я просто манипулирую массивом на месте. Я хотел бы сделать это в минимально возможной памяти .
Может кто-нибудь подсказать, как это сделать? Какие варианты java и почему?