Есть ли у объекта в java какие-либо ограничения на размер памяти?

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

Спасибо

8
задан Joachim Sauer 1 September 2010 в 13:02
поделиться

4 ответа

Java Heap ограничивает размер объектов, которые вы можете иметь в системе. Если размер вашего объекта выходит за пределы кучи, будет сгенерирована ошибка «Недостаточно памяти».

В вашем случае общий размер вашего объекта (объект в ArrayList + другие объекты в вашей системе) имеет большее значение, так как ваш ArrayList будет просто ссылаться на эти объекты.

Вот параметры виртуальной машины, которые вы можете использовать для установки размера кучи в соответствии с вашими требованиями (из документации java):

-Xms n

Указать начальный размер в байтах пул выделения памяти.Это значение должно быть кратно 1024 больше чем 1 МБ. Добавьте букву k или K к указать килобайты, или m или M для указать мегабайты. Значение по умолчанию составляет 2 МБ. Примеры:

  -Xms6291456
 -Xms6144k
 -Xms6m
 

-Xmx n

Укажите максимальный размер в байтах пул выделения памяти. Это значение должно быть кратно 1024 больше, чем 2 МБ. Добавьте букву k или K к указать килобайты, или m или M для указать мегабайты. Значение по умолчанию составляет 64 МБ. Примеры:

  -Xmx83886080
 -Xmx81920k
 -Xмx80м
 

Проверить информацию о куче из VM Spec

3.5.3 Куча

Виртуальная машина Java имеет кучу, которая совместно используется всеми потоками виртуальной машины Java. Куча — это область данных времени выполнения, из которой выделяется память для всех экземпляров класса и массивов. Куча создается при запуске виртуальной машины. Хранилище кучи для объектов освобождается > автоматической системой управления хранилищем (известной как сборщик мусора); объекты никогда >явно не освобождаются. Виртуальная машина Java не предполагает никакого конкретного типа автоматической >системы управления памятью, и техника управления памятью может выбираться в соответствии с системными >требованиями разработчика. Куча может иметь фиксированный размер или может >расширяться в соответствии с требованиями вычислений и может сокращаться, если куча большего размера становится >ненужной. Память для кучи не обязательно должна быть непрерывной.

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

С кучей связано следующее исключительное состояние:

Если для вычисления требуется больше кучи, чем может быть доступно автоматической системой управления памятью, виртуальная машина Java выдает ошибку OutOfMemoryError.

4
ответ дан 5 December 2019 в 10:00
поделиться

Если у вас есть объект (назовем его A), который ссылается на ArrayList с множеством объектов в нем, "размер" A все равно будет довольно небольшим (размер ссылки плюс немного накладных расходов). Объекты, на которые ссылается A, в значительной степени независимы от A. Единственным ограничением является то, что общий размер всех объектов ограничен доступной памятью.

Единственным по-настоящему «огромным объектом» был бы объект с множеством полей, но здесь спецификация JLS/JVM устанавливает довольно небольшое ограничение ( fields_count в формате файла класса — это поле u2, поэтому у вас может быть не более 65 535 полей).

13
ответ дан 5 December 2019 в 10:00
поделиться

Единственным ограничивающим фактором является максимальный размер кучи, у меня также было несколько толстых объектов размером 100 МБ в качестве базы данных в памяти.

0
ответ дан 5 December 2019 в 10:00
поделиться

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

0
ответ дан 5 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: