Сколько памяти занимает массив java
Перейти к содержимому

Сколько памяти занимает массив java

  • автор:

 

Использование памяти массивом строк Java

Сколько места занимает массив строк Java? В частности, сколько места (в байтах) занимает строковый массив, который выглядит примерно так:

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

Итак, напомним, сколько места занимает массив строк (если его можно измерить)?

Можно было просто измерить. Но предположим, что каждое на 1 КБ больше, чем то, что вы здесь показываете. Это 5 млн. IMO не стоит беспокоиться, если у вас не заканчивается память. Ты? (Возможно, нет необходимости повторять вопрос из четырех предложений.) — Dave Newton

вы можете получить приблизительную оценку, заглянув внутрь источника String. String хранит свое содержимое в массиве символов, и каждый символ в java занимает 2 байта. Внутри String есть еще несколько полей. — Reddy

Если вам нужна фактическая сумма, профилировщик, такой как VisualVM (который поставляется бесплатно с JDK), может сказать вам это, не вычисляя его. — Peter Lawrey

5 ответы

Строка массив это просто массив ссылок — массив размером N займет примерно (N * 4 + 20) или (N * 8 + 20) байтов в зависимости от размера ссылки в вашей JVM.

Если вас интересует общий объем хранилища, вам следует выяснить, сколько отдельных объектов String у вас есть, и Также сколько у вас массивов. Если у вас есть 5000 массивов, но они в основном содержат ссылки на одни и те же строки, скорее всего, все будет в порядке. Если у вас есть 5000 массивов, каждый из которых содержит 5 строк, которые больше нигде не используются, это 25,000 строк . что все еще, вероятно, не очень много (строка длиной 20, вероятно, займет около 60 байт).

Конечно, здесь имеет значение контекст: на чем будет работать ваш код? Если он работает на настольном ПК, то несколько мегабайт, вероятно, не проблема . может быть быть больше проблемой по телефону.

Спасибо, поэтому я просто должен найти, сколько места каждая строка займет в массиве, и умножить его на 5,000. Я сделаю это сейчас и опубликую повторно. — Рассел

@Russell: Ну, не совсем — потому что это зависит от того, являются ли эти строки общими или нет. — Джон Скит

Он должен работать на компьютере среднего класса. Я использовал ваши факты, и все будет нормально. (программа, когда она будет завершена, займет около половины гига) — Рассел

Каждая ссылка может занимать 80 байт? Это опечатка для (N * 8 + 20) или он действительно такой большой? — OpenSauce

Строковые массивы могут занимать сколько угодно? вы определяете размер массива String. Строка [] abc = новая Строка [80]. Но я полагаю, вы это уже знаете . может быть, я не понял ваш вопрос.

1 символ = 2 байта, а не 4 байта, поскольку Java использует 16-битный Unicode — это то, что вы ищете?

Integer.MAX_VALUE или доступная куча? может быть, максимальный размер доступен?

Ответить непросто, поскольку String — это сложный объект с множеством полей. Дело не только в количестве символов. И это также зависит от того, сколько памяти доступно в вашей системе. На сервере с 64 ГБ RAM это проблема? Нет. А на мобильном телефоне? да. На ответ может повлиять слишком много переменных.

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

Я был бы немного осторожен, делая подобное заявление; на встроенных устройствах ваши алгоритмические механизмы / механизмы хранения вполне могут быть обусловлены ограничениями устройства. — Дэйв Ньютон

Единственный способ точно измерить использование памяти — использовать профилировщик памяти.

Я написал простую программу, которая выделяет 5,000 массивов, соответствующих вашему описанию. Затем я измерил использование памяти с помощью YourKit.

Объем памяти, используемый массивами, варьировался в десять раз:

  1. Если все массивы используют одни и те же строковые литералы, в сумме они занимают около 200 КБ ОЗУ.
  2. Если каждый массив содержит уникальные случайно сгенерированные строки (той же длины, что и в первом случае), они занимают около 2 МБ ОЗУ.

Джон Скит прав (как практически всегда), но вы можете значительно сократить использование памяти, используя ссылки на enums и EnumSets вместо «нетипизированных» строковых представлений ваших объектов, которые вы предлагаете.

Использование типизированных данных, особенно enums , также является хорошей практикой кодирования.

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками java data-storage arrays or задайте свой вопрос.

Сколько места занимает массив?

Я имею в виду, если я создам 10 целых чисел и целочисленный массив из 10, будет ли какая-либо разница в занятом занятом пространстве.

Я задал этот вопрос: мне нужно создать булевский массив из миллионов записей, поэтому я хочу понять, сколько места будет занимать массив.

9 ответов

Массив целых чисел представлен как блок памяти для хранения целых чисел и заголовка объекта. Заголовок объекта обычно занимает 3 32-битных слова для 32-разрядной JVM, но это зависит от платформы. (Заголовок содержит некоторые биты флага, ссылку на дескриптор класса, пространство для информации об элементарной блокировке и длину фактического массива. Плюс добавление.)

Таким образом, массив из 10 int, вероятно, занимает область 13 * 4 байтов.

В случае с Integer[] каждый объект Integer имеет заголовок 2 слова и поле 1 слово, содержащее фактическое значение. Также вам нужно добавить в дополнение и 1 слово (или от 1 до 2 слов на 64-битной JVM) для справки. Обычно это 5 слов или 20 байтов на элемент массива. если некоторые объекты Integer не отображаются в нескольких местах массива.

  • Число слов, фактически используемых для ссылки на 64-битной JVM, зависит от того, используются ли «сжатые oops».
  • На некоторых JVM узлы кучи выделяются в кратных 16 байтах. которые раздувают использование пространства (например, указанное дополнение).
  • Если вы берете идентификатор хэш-кода объекта и выживаете в следующей сборке мусора, его размер завышается не менее чем на 4 байта для кэширования значения хэш-кода.
  • Эти числа относятся ко всем версиям и поставщикам, в дополнение к перечисленным выше источникам изменчивости.

В java у вас есть как Integer, так и int. Предположим, что вы ссылаетесь на int, массив ints считается объектом, а объекты имеют метаданные, поэтому массив из 10 ints будет занимать более 10 переменных int

В свете вашего комментария это не будет иметь большого значения, если вы использовали массив. Массив будет использовать незначительную часть памяти для самой ее функциональности. Все остальные памяти будут использоваться хранимыми объектами.

EDIT: вам нужно понять, что разница между Boolean wrapper и boolean primitive type. Типы обертки обычно занимают больше места, чем примитивы. Поэтому для миссий записей старайтесь идти с примитивами.

Еще одна вещь, которую следует иметь в виду при работе с миссиями записи, как вы сказали, — это Java Autoboxing. Снижение производительности может быть значительным, если вы непреднамеренно используете его в функции, которая перемещает весь массив.

Некоторые грубые вычисления нижних границ:

Каждый int занимает четыре байта. = 40 байт для десяти

В массиве int берется четыре байта для каждого компонента плюс четыре байта для хранения длины плюс еще четыре байта для хранения ссылки на него. = 48 байтов (возможно, некоторое дополнение для выравнивания всех объектов с границами 8 байтов)

Целое число занимает не менее 8 байт, плюс еще четыре байта для хранения ссылки на него. = не менее 120 за десять

Массив Integer занимает по меньшей мере 120 байт для десяти целых чисел плюс четыре байта для длины, а затем, возможно, некоторое дополнение для выравнивания. Плюс четыре байта, чтобы сохранить ссылку на него. (@Marko сообщает, что он даже измерил около 28 байтов на каждый слот, так что это было бы 280 байтов для массива из десяти).

Он не должен плохо отражать учителя/интервьюера.

Насколько вы заботитесь о размере и выравнивании переменных в памяти, зависит от того, насколько результативен ваш код. Это важно, если ваше программное обеспечение обрабатывает транзакции (например, EFT/фондовый рынок).

 

Размер, выравнивание и упаковка ваших переменных в памяти могут влиять на удары/промахи кэша CPU, которые могут влиять на производительность вашего кода на коэффициент 100.

Неплохо, чтобы знать, что происходит на низком уровне, до тех пор, пока вы используете ответные меры, повышающие производительность.

Например, я пришел к этому потоку, потому что мне нужно было знать ответ именно на этот вопрос, так что я могу определить размеры массивов примитивов, чтобы заполнить целое число, кратное строкам кэша CPU, потому что мне нужен код, который выполняет вычисления по тем массивам примитивов, которые выполняются быстро, потому что у меня есть конечное окно, в котором мне нужны мои вычисления, чтобы они были готовы для потребителя результата.

What is the memory size of an ArrayList in Java

I have an ArrayList<Obj> and I wish to know how much memory it is using.

The Obj is variant so, it is not as easy as multiply the number of elements in the array per the size of an object.

ROMANIA_engineer's user avatar

magallanes's user avatar

10 Answers 10

It’s the capacity of the java.util.ArrayList multiplied by the reference size (4 bytes on 32bit, 8bytes on 64bit) + [Object header + one int and one references] .

The capacity is different (always >=) than the size but you want to make ’em equal, call trimToSize()

Technically speaking the ArrayList has an Object[] where it stores the data.

user3145373 ツ's user avatar

You can use something like Runtime.getRuntime().totalMemory() and its counterpart Runtime.getRuntime().freeMemory() to get an educated guess, but that doesn’t account for objects that are GC’ed between calls.

Jon's user avatar

This is what a memory profiler is for. It will tell you for your platform. The minimum size for an empty ArrayList is 64-bytes. It is highly likely you don’t need to know this unless you have 100K elements or more.

You can brute force calculate it if you know the content distribution of the objects.

However, the most precise method I can think of is to look at it in a profiler. There are free tools out there, some that come with the JDK. However, the best tool I’ve used is Yourkit. That doesn’t mean it’s the only solution, just my favorite.

You may have to use a profiler like the one available in Netbeans that will show you the memory consumption of our program and can give you some details about each object.

Vincent Ramdhanie's user avatar

Someone Somewhere's user avatar

The answer is, it depends on how you measure. If you asked me the size of an ArrayList I would give you the shallow size. That is to say, an ArrayList consists of an array of references and an integer indicating the number of contained elements. If you wanted to know the size it is quite simply 4 + *array.length.

If you want to know the size of the ArrayList and all contained elements then there are some heap analyzers that can figure this out. I believe YourKit is one of them.

The memory usage of java depends of the JVM implementation. The only real method to determine the memory usage of an instance I know is to use an Java 5 instrumentation agent. There is a little tutorial to do so.

The way an ArrayList works is that it simply contains an array of a certain size (which can be specified in the constructor, I believe 10 is the default?). Whenever the number of elements becomes too large for the internal array, the size of the internal array is doubled. So you need to multiply the size of the object by the size of the internal array.

Take heap dump, after adding and deleting elements from your ArrayList. Use any heap analyzer. (Eclipse MAT I prefer) You might see null values placed for deleted items. this makes ArrayList to hold memory in a heap even when there are only a few elements or no element. You can see the exact consumed memory size in the "Retained Heap" column.

    The Overflow Blog
Linked
Related
Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.3.11.43304

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Где выделяется память для массивов в Java?

Java Networking (сеть)

Программирование и разработка

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

Базовый адрес массива: адрес первого элемента массива называется базовым адресом массива. Каждый элемент будет занимать место в памяти, необходимое для размещения значений его типа, т.е. в зависимости от типа данных элементов для каждого элемента выделяется 1, 4 или 8 байтов памяти. Следующий адрес памяти назначается следующему элементу в массиве. Этот процесс выделения памяти продолжается до тех пор, пока не будет превышено количество элементов массива.

Ячейки памяти JVM. Прежде чем перейти к вопросу о том, где в Java хранится массив, мы должны знать о ячейках памяти в JVM (виртуальная машина Java). Они есть:

  • Heap — объекты Java хранятся в области, называемой кучей. Куча создается при запуске JVM и может увеличиваться или уменьшаться во время работы приложения. Когда груды кучи заполняются, отходы собираются. Во время сборки мусора объекты, которые больше не используются, удаляются, освобождая место для новых объектов.
  • Stack — это структура данных (последним пришел — первым вышел). Он поддерживает две основные операции, называемые push и pop. Операция push добавляет элемент на вершину стека, а операция pop удаляет элемент с вершины стека. Он действует как хранилище частичной переменной.
  • PC Registers — регистр счетчика программ (ПК) отслеживает текущую инструкцию, выполняемую в любой момент времени. Это похоже на указатель на текущую инструкцию в последовательности инструкций программы.
  • Execution Engine — механизм выполнения является основным компонентом виртуальной машины Java (JVM). Он взаимодействует с различными областями памяти JVM. Каждый поток запущенного приложения — это отдельный экземпляр среды выполнения виртуальной машины.
  • Native Method Stack. Собственные методы могут получать доступ к специфичным для системы функциям и API, которые недоступны непосредственно в Java. Собственный метод — это интерфейс для Java для вызова кода, отличного от Java. Собственный метод — это метод Java: метод реализован на языке, отличном от Java, таком как C.

Где выделяется память для массива в Java?

Memory is allocated in Heap are for the Array in Java.

В Java ссылочные типы хранятся в области кучи. Поскольку массивы также являются ссылочными типами (их можно создать с помощью ключевого слова «new» ), они также хранятся в области кучи. Массивы используются для хранения нескольких значений в одной переменной вместо объявления отдельных переменных для каждого значения. В Java в массиве хранятся примитивные значения (int, char и т.д.) или ссылки (т.е. указатели) на объекты.

Одномерный массив:

int[] arr — это просто ссылка на массив из пяти целых чисел. Если вы создаете массив с 50 целыми числами, то же самое — выделяется массив и возвращается ссылка.

int intArray[]; //declaring array
intArray = new int[10]; // allocating memory to array

Мы используем new для выделения массива, вы должны указать тип и количество элементов для выделения.

Массив объектов:

В случае массива объектов ссылка на массив хранится в куче. И сами элементы массива тоже хранят ссылку на объекты.

class A <
. . .
>

public class Ex <
public static void main(String[] args) <
A arr[] = new A[5]
>
>

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *