Почему создание большого массива Java занимает так много памяти? - PullRequest
4 голосов
/ 15 сентября 2010

Почему следующая строка

    Object[] objects = new Object[10000000];

приводит к тому, что JVM использует много памяти (~ 40M)?Есть ли способ узнать внутреннюю работу ВМ при распределении массивов?

Ответы [ 10 ]

22 голосов
/ 15 сентября 2010

Хорошо, это выделяет достаточно места для 10000000 ссылок, а также небольшое количество служебных данных для самого объекта массива.

Фактический размер будет зависеть от виртуальной машины - но, безусловно, неудивительно, что она занимает достаточное количество памяти ... Я ожидаю, что не менее 40 МБ и, вероятно, 80 МБ на 64 битовая ВМ, если она не использует сжатые значения для массивов.

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

17 голосов
/ 15 сентября 2010

Что вы подразумеваете под "большим количеством памяти"?Вы выделяете 10000000 указателей, каждый из которых занимает 4 байта (на 32-битной машине) - это около 40 МБ памяти.

3 голосов
/ 15 сентября 2010

Создает массив с 10.000.000 ссылочных указателей, все инициализированные с null.

Что вы ожидали, говоря, что это "много"?


Дополнительная литература

3 голосов
/ 15 сентября 2010

Ваш массив должен содержать 10 миллионов ссылок на объекты, которые на современных платформах представляют собой 64-битные (8-байтовые) указатели.Поскольку он выделяется как непрерывный кусок памяти, он должен занимать 80 миллионов байт.В каком-то смысле это большой, маленький по сравнению с вероятным объемом вашей памяти.Почему это тебя беспокоит?

3 голосов
/ 15 сентября 2010

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

Чтобы посмотреть внутреннюю работу JVM, вы можете проверить его исходный код , так как он с открытым исходным кодом.

3 голосов
/ 15 сентября 2010

Вы резервируете место для десяти миллионов ссылок. Это совсем немного.

3 голосов
/ 15 сентября 2010

Вы создаете десять миллионов ссылок на объект.Ссылка не менее 4 байтов;Во IIRC в Java это может быть 8, но я не уверен в этом.

Итак, с помощью одной строки вы создаете 40 или 80 мегабайт данных.

2 голосов
/ 15 сентября 2010

Согласно этому сайту использование памяти для массивов составляет 12-байтовый заголовок + 4 байта на элемент.Если вы объявите пустой массив Object, содержащий 10M элементов, то у вас будет около 40 МБ памяти, используемой с самого начала.Если вы начнете заполнять этот массив на самом деле объектом 10M, то его размер будет довольно быстро увеличиваться.

С этого сайта, и я только что проверил его на своей 64-битной машине, размеробычный Object составляет около 31 байта, поэтому массив из 10M Object составляет всего около 12 байтов + (4 + 31 байтов) * 10M = 350 000 012 байтов (или 345,78 МБ)

Если вашмассив содержит другие типы объектов, тогда его размер будет еще больше.

Я бы посоветовал вам использовать какой-либо файл (ы) произвольного доступа для хранения ваших данных, если вам нужно хранить так много данных внутри вашегопрограмма.Или даже используйте базу данных, такую ​​как Apache Derby , которая также позволит вам сортировать и фильтровать данные и т. Д.

2 голосов
/ 15 сентября 2010

Одна из главных причин, по которой массивы используются так широко, заключается в том, что к их элементам можно обращаться в постоянное время. Это означает, что время, необходимое для доступа к [i], одинаково для каждого индекса i. Это потому, что адрес [i] может быть определен арифметически путем добавления подходящего смещения к адресу заголовка массива. Причина в том, что пространство для содержимого массива выделяется как непрерывный блок памяти.

0 голосов
/ 15 сентября 2010

Я могу отставать от времени, но из книги «Практическая Java» я понял, что векторы более эффективны и быстрее, чем массивы. Можно ли использовать вектор вместо массива?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...