Можем ли мы иметь объект Java любого размера без страха исключения? Я собираюсь использовать объект класса, который состоит из ArrayList
тысяч других объектов, который содержит пары HashMap
и ArrayList
и многих других не примитивный тип.
Спасибо
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.
Если у вас есть объект (назовем его A
), который ссылается на ArrayList
с множеством объектов в нем, "размер" A
все равно будет довольно небольшим (размер ссылки плюс немного накладных расходов). Объекты, на которые ссылается A
, в значительной степени независимы от A
. Единственным ограничением является то, что общий размер всех объектов ограничен доступной памятью.
Единственным по-настоящему «огромным объектом» был бы объект с множеством полей, но здесь спецификация JLS/JVM устанавливает довольно небольшое ограничение ( fields_count
в формате файла класса — это поле u2
, поэтому у вас может быть не более 65 535 полей).
Единственным ограничивающим фактором является максимальный размер кучи, у меня также было несколько толстых объектов размером 100 МБ в качестве базы данных в памяти.
Конечно, у него есть ограничения по памяти. Однако вы можете управлять памятью кучи, инициализируя ее до большего размера. Но это не гарантирует, что вы можете использовать неограниченную память по своему усмотрению.