Переключение размеров массива в 2d массиве занимает разное количество памяти - PullRequest
5 голосов
/ 31 января 2020

Я объявил матрицу двумерного массива в Java байта типа. При проверке памяти, используемой с размерами (10 ^ 6 x 4), она резко отличалась от матрицы того же размера, но с размерами (4 x 10 ^ 6).

// Measure memory before matrix initialization -> 2MB
System.out.println("Meg used="+(Runtime.getRuntime().totalMemory()-
 Runtime.getRuntime().freeMemory())/(1000*1000)+"M");

byte[][] test = new byte[4][1000000]; // init

// Measuring memory after -> 6MB as expected
System.out.println("Meg used="+(Runtime.getRuntime().totalMemory()-
 Runtime.getRuntime().freeMemory())/(1000*1000)+"M");
// Measure memory before matrix initialization -> 2MB
System.out.println("Meg used="+(Runtime.getRuntime().totalMemory()-
 Runtime.getRuntime().freeMemory())/(1000*1000)+"M");

byte[][] test = new byte[1000000][4]; // init

// Measuring memory after -> 30MB
System.out.println("Meg used="+(Runtime.getRuntime().totalMemory()-
 Runtime.getRuntime().freeMemory())/(1000*1000)+"M");

В первом Я получаю 6 МБ, поэтому массив занимает 4 МБ, как и ожидалось. Однако во втором случае матрица занимает 28 МБ. Почему они не равны?

1 Ответ

4 голосов
/ 31 января 2020

Это накладные расходы, которые имеют значение. Для каждого массива Java необходимо сохранить информацию. Это всего 4 длинных массива против 1000000 коротких.

...