Если у меня есть:
int c[] = new int[10];
и
int a[][] = new int[2][3];
и вообще
a n*m*..*j
массив
как я могу рассчитать реальное использование памяти, учитывая также переменные-ссылки?
Если у меня есть:
int c[] = new int[10];
и
int a[][] = new int[2][3];
и вообще
a n*m*..*j
массив
как я могу рассчитать реальное использование памяти, учитывая также переменные-ссылки?
Если вам нужен точный ответ, вы не можете. По крайней мере, не так легко. Этот поток объясняет больше.
Проблема с ответами Брагадеша и Баккала заключается в том, что они игнорируют накладные расходы. Каждый массив также хранит такие вещи, как количество измерений, сколько он есть, и некоторые вещи, которые использует сборщик мусора.
Для простой оценки вы должны быть в порядке, используя вычисления из других ответов и добавляя 100-200 байт.
Я знаю, что я немного опаздываю на вечеринку, но очень сложно вычислить объем памяти.
Давайте рассмотрим ваш первый пример: 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-измерений довольно сложно, но вы получаете идею.
int[]
или int[][]
не является примитивным типом данных. Это объект в Java. И с объектом, размер не может быть рассчитан сразу.
вы, вероятно, получите наилучшее приближение: http://java.sun.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize(java.lang.Object)
Этот статья, и этот всеобъемлющий демонстрирует/детализирует этот подход
для исходного типа: базовый тип и размер байта
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 размера.