2010-09-01 3 views
7

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

Спасибо

ответ

2

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

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

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

-Xmsн

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

 
     -Xms6291456 
     -Xms6144k 
     -Xms6m 

-Xmxн

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

 
     -Xmx83886080 
     -Xmx81920k 
     -Xmx80m 

Проверить информация вороха от VM Spec

3.5.3 Heap

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

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

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

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

0

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

0

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

0

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

13

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

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

+10

Черт, я просто проектировал объект с полями 65536 :( – fish

+4

@fish: это не дизайн, это авария ;-) –

0

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

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

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

Смежные вопросы