Подтвердить что ты не робот

Как вычислять использование памяти в Java-массиве

Если у меня есть:

int c[] = new int[10];

и

int a[][] = new int[2][3];

и вообще

a n*m*..*j массив

как я могу рассчитать реальное использование памяти, учитывая также переменные-ссылки?

4b9b3361

Ответ 1

Если вам нужен точный ответ, вы не можете. По крайней мере, не так легко. Этот поток объясняет больше.

Проблема с ответами Брагадеша и Баккала заключается в том, что они игнорируют накладные расходы. Каждый массив также хранит такие вещи, как количество измерений, сколько он есть, и некоторые вещи, которые использует сборщик мусора.

Для простой оценки вы должны быть в порядке, используя вычисления из других ответов и добавляя 100-200 байт.

Ответ 2

Я знаю, что я немного опаздываю на вечеринку, но очень сложно вычислить объем памяти.

Давайте рассмотрим ваш первый пример: int c[] = new int[N];

В соответствии с 64-разрядной моделью памяти, int составляет 4 байта, поэтому все элементы будут размером 4 * N байтов. В дополнение к этому, у Java есть избыток 24 байта, а также 8 байтов для реального объекта массива. Так что в общей сложности 32 + 4 * N байта.

Для двумерного массива: int a[][] = new int[N][M];

Это в основном то же самое, что каждый элемент в первом массиве - это другой массив размера M, поэтому вместо 4 мы имеем 32 + 4 * M, поэтому общий размер равен 32 + (32 + 4 * M) * N.

Верно, что обобщение для D-измерений довольно сложно, но вы получаете идею.

Ответ 3

int[] или int[][] не является примитивным типом данных. Это объект в Java. И с объектом, размер не может быть рассчитан сразу.

Ответ 5

для исходного типа: базовый тип и размер байта

  • boolean 1
  • байт 1
  • char 1
  • int 4
  • float 4
  • long 8
  • double 8
  • Interger 24 (16 для экземпляра класса + 4 для int + 4 для выравнивания памяти)

int a [M]: 24 + 4M

(16 для класса + 4 для сохранения размера массива + 4 для выравнивания памяти) + (для M размер double, нам нужно 4 * M)

int a [M] [N]: (24 + 4M) + M * (24 + 4N) = 24 + 28M + 4MN ~~~ 4MN

относиться к [M] [N] как размер M двоичного массива a [N] плюс один дополнительный массив, чтобы сохранить ссылку на начальную точку массива M размера.