Распределение памяти в JVM - PullRequest
1 голос
/ 04 марта 2012

Я думаю о распределении памяти в Java, т.е. в которой в памяти хранятся методы, поля и объекты.

Предположим, у меня есть 2 класса

import java.util.*;
class ABC
{
int field;
List<Integer>l;
}   
class XYZ 
{
int x,y,z;
static int p;
void fun(ABC a){
    a.field = 10;
    a.l = new ArrayList<Integer>(10);
    a.l.add(10);
}
}   
public class Simulator{
public static void main(String[] arg){
    XYZ tmp_1 = new XYZ();
    ABC tmp_2 = new ABC();
    tmp_1.fun(tmp_2);
    System.out.println(tmp_2.l);
}

}

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

Мои мысли - объекты, члены-данные будут храниться в куче, но я не уверен насчет функций и их членов-данных?

Ответы [ 3 ]

4 голосов
/ 04 марта 2012

Да, все объекты расположены в куче.Т.е. все, что создано с помощью new, будет помещено в кучу.Таким образом, все поля таких объектов также находятся в куче.

Полагаю, вы ссылаетесь на локальные переменные и параметры в функциях.Они помещаются в стек (для каждого вызова функции).Обратите внимание, однако, что когда переменные / параметры функции относятся к ссылочным типам, то фактический объект, на который они указывают, находится в куче, но сама переменная / параметр будет в стеке (аналогично указателю в C / C ++).С другой стороны, функциональные переменные / параметры примитивных типов (например, int, double и т. Д.) Будут полностью в стеке.Немного связанным, но относящимся к теме, является понятие boxing .

Сами функции являются статическим кодом и хранятся в специальной части памяти, где находится весь исполняемый код.Обратите внимание, что все экземпляры класса совместно используют одни и те же функции (т. Е. «Новые функции» не создаются с вновь созданными объектами, даже если эти функции являются функциями экземпляра ).Таким образом, когда вы вызываете функцию экземпляра для объекта, специальная ссылка this передается этой функции (это неявный аргумент функции).Вот как функция знает, на какие объекты она должна воздействовать.

1 голос
/ 04 марта 2012

Вот описание того, как хранятся различные вещи, на которые вы ссылаетесь или на которые ссылаетесь:

  • Локальные переменные и параметры метода / конструктора могут содержать либо примитивные значения, либо ссылки на объекты или массивы. (Они не могут содержать сами объекты или массивы.) Локальные данные и параметры хранятся в фреймах активации (для использования терминологии JLS), и эти фреймы хранятся в стеке потока. Стеки потоков - это не куча памяти в типичных JVM.

  • Объекты и массивы представлены в динамической памяти.

  • Поля экземпляра (содержащие примитивные или опорные значения) хранятся в объектах и, следовательно, в куче.

  • Элементы массива (примитивные или ссылочные значения) и длина массива хранятся в массиве и, следовательно, в куче.

  • Статические поля хранятся в специальных кадрах, называемых статическими кадрами. Эти кадры хранятся в куче.

  • Код методов Java (в байт-коде и в форме собственного кода) обычно представлен кодовыми блоками, которые хранятся в куче.


Обратите внимание, что вышеизложенное основано на том, что происходит в типичной JVM. Фактически, Спецификация языка Java не требует, чтобы вещи хранились в стеке или куче. Термины «стековая память» и «кучная память» практически не встречаются в JLS, и вполне возможно, что можно использовать другие схемы организации памяти.

Кроме того, «куча» является чрезмерным упрощением, поскольку JVM / GC в HotSpot обычно разделяет кучу на области с различными характеристиками. Например, область «permgen» кучи (где размещаются статические кадры и кодовые блоки) - это только сборщик мусора.

0 голосов
/ 04 марта 2012

В дополнение к предыдущему ответу:

  1. Функции хранятся в специальной области, но ссылка на них сохраняется в объекте (для нестатических функций).
  2. Ссылка настатические функции хранятся в другой области (вы можете думать, что они хранятся рядом со статическими полями) (статическая область памяти).
  3. Все объекты хранятся в куче (Object Pool), но место ссылки на нихварьируются, локальные переменные находятся в стеке, нестатические поля хранятся в самом объекте, поэтому они также хранятся в куче.
  4. Статические ссылки помещаются в другую специальную часть памяти (хотя, если ониявляются ссылками на объекты, они указывают на кучу).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...