Есть ли у объекта в Java какие-либо ограничения на размер памяти? - PullRequest
8 голосов
/ 01 сентября 2010

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

Спасибо

Ответы [ 7 ]

13 голосов
/ 01 сентября 2010

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

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

4 голосов
/ 01 сентября 2010

Java Heap - это ограничение на размер объектов, которые вы можете иметь в системе. Если размер вашего объекта превышает кучу, то будет сгенерирована ошибка Out of Memory.

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

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

-Xms п

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

       -Xms6291456
       -Xms6144k
       -Xms6m

-Xmx п

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

       -Xmx83886080
       -Xmx81920k
       -Xmx80m

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

3.5.3 Куча

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

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

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

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

0 голосов
/ 14 марта 2014

Размер памяти объекта основан на размере памяти кучи. Объект может содержать размер памяти кучи. См. Следующую ссылку. http://javarevisited.blogspot.in/2011/05/java-heap-space-memory-size-jvm.html

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

Общий лимит кучи является основным ограничением памяти. Пока ваши объекты вписываются в это, вы будете в порядке.

Вы можете проверить это, если хотите, выделив много больших массивов и наблюдая, когда вы получите OutOfMemoryErrors.

Существует также ограничение размера массива 2147483647 из-за размера целочисленных индексов. Однако на самом деле никто никогда не сталкивался с этим на практике.

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

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

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

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

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

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

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