Java Хранение Данных

Как Java хранит данные в памяти?
Информация в посте приведена на основе книги Эккель Б. Философия Java (4-е издание)
Каждый язык программирования имеет свои средства для работы с данными в памяти. В Java вы обращаетесь со всеми данными как с объектом. Идентификатор, которым вы манипулируете, на самом деле представляет собой ссылку на объект.
Когда вы определяете ссылку, желательно присоединить ее к новому объекту. Обычно это делается при помощи ключевого слова new. Фактически оно означает: "Создайте мне новый объект". Например
String s = new String("Hello world");
Полезно отчетливо представлять, что происходит во время работы программы, и в частности, как данные размещаются в памяти. Существует пять разных мест для хранения данных
- Регистры. Это самое быстрое хранилище, потому что данные хранятся прямо внутри процессора. Однако количество регистров жестко ограничено, поэтому регистры используются компилятором по мере необходимости. У вас, как программиста, нет прямого доступа к регистрам, вы не найдете и малейших следов их поддержки в языке.
- Стек. Эта область хранения данных находится в общей оперативной памяти (RAM), но процессор предоставляет прямой доступ к ней с использованием указателя стека. Указатель стека перемещается вниз для выделения памяти или вверх для ее освобождения. Это чрезвычайно быстрый и эффективный способ размещения данных, по скорости уступающий только регистрам. Во время обработки программы компилятор Java должен знать жизненный цикл данных, размещаемых в стеке. Это ограничение уменьшает гибкость ваших программ, поэтому, хотя некоторые данные Java хранятся в стеке (особенно ссылки на объекты), сами объекты Java не помещаются в стек.
- Куча. Пул памяти общего назначения (находится также в RAM), в котором размещаются все объекты Java. Преимущество кучи состоит в том, что компилятору не обязательно знать, как долго просуществуют находящиеся там объекты. Таким образом, работа с кучей дает значительное преимущество в гибкости. Когда вам нужно создать объект, вы пишете код с использованием new, и память выделяется из кучи во время выполнения программы. Конечно, за гибкость приходится расплачиваться: выделение памяти из кучи занимает больше времени, чем в стеке.
- Постоянное хранилище. Значения констант часто встраиваются прямо в код программы, так как они неизменны. Иногда такие данные могут размещаться в постоянной памяти (ROM), если речь идет о "встроенных" системах.
- Внешнее хранилище. Если данные хранятся вне программы, они могут существовать и тогда, когда она не выполняется. Два основных примера: потоковые объекты (streamed objects)‚ в которых объекты представлены в виде потока байтов, обычно используются для передачи на другие машины, и долгоживущие (persistent) объекты, которые запоминаются на диске и сохраняют свое состояние даже после окончания работы программы. Особенностью этих видов хранения данных является возможность перевода объектов в нечто, что может быть сохранено на другом носителе информации, а потом восстановлено в виде обычного объекта, хранящегося в оперативной памяти. В Java организована поддержка легковесного (lightweight) сохранения состояния, а такие механизмы, как JDBC и Hibernate, предоставляют более совершенную поддержку сохранения и выборки информации об объектах из баз данных.
Source: proft.me
Все ли мы знаем про oomkilled статья