Главная » Java, Структуры данных и алгоритмы » Распределение памяти в Java

0

В п. 4.1.3 рассматривался способ размещения Java-машиной локальных переменных метода в его фрейме, находящемся в Java-стеке. Java-стек не единственный вид памяти, доступный для данных Java-nporpaMMbi.

Распределение памяти, Необходимой для хранения объектов, може^г осуществляться динамически во время выполнения метода благодаря использованию встроенного в Java бйератора new. Например, можно создать новый объект из 12 элементов класса Vector с помощью следующей команды:

Vector items = new Vector(12)

Объект класса Vector может обрабатываться как массив, однако отличается тем, что его длина может быть при необходимости увеличена или уменьшена. Кроме того, этот объект существует даже после завершения работы создавшего его метода. Таким образом, для выделения памяти данному объекту Java-стек не может использоваться.

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

Для удобства предположим, что блоки динамической памяти имеют фиксированный размер, например, 1024 байта, и одного блока достаточно для размещения любого создаваемого объекта (управление более общим случаем является по существу интересной исследовательской проблемой).

Рис. 4.5. Схема распределения адресов памяти в виртуальной машине Java

Исходя из определения виртуальной машины Java, динамическая память должна быстро выделять блоки для новых объектов, однако в ней не определен используемый при этом алгоритм. Таким образом, при использовании виртуальной машины Java применяется любой оптимальный способ реализации. Пользуясь такой свободой выбора, для управления свободными блоками в динамической памяти применим очередь. Если метод использует оператор new для выделения блока памяти новому объекту, то с помощью операцию dequeue над очередью неиспользованных блоков предоставим объекту свободный блок динамической памяти. Подобным же образом, определив (с помощью «сборщика мусора»), что выделенный ранее блок, памяти не используется, виртуальная машина Java выполняет операцию enqueue и возвращает этот блок в очередь неиспользуемых блоков.

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

Существуют и,другие способы применения очередей в Java.

Источник: Гудрич М.Т. Г93 Структуры данных и алгоритмы в Java / М.Т. Гудрич, Р. Тамассия; Пер. с англ. A.M. Чернухо. — Мн.: Новое знание, 2003. — 671 е.: ил.

По теме:

  • Комментарии