Как JVM может выделять память для объектов, несмотря на вероятность того, что они могут впоследствии увеличиться в размере - PullRequest
0 голосов
/ 08 ноября 2018

Считайте, что у нас есть класс Node в Java, как это:

class Node{
Node prev;
Node next;
}

когда мы создаем новый узел (Node sample = new Node();), как JVM выделяет достаточно памяти для объекта. Его размер может измениться в будущем. Например, позже я могу установить sample.setPrev(new Node()) и так далее. поэтому, если JVM рассматривает индексы от 1000 до 2000 в памяти для этого образца объекта, тогда его размер может измениться, и индекс памяти 2001 может быть не пустым для нашего использования.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Все объекты Java имеют фиксированный размер, который известен в момент создания объекта. Никакие операции, выполняемые вашим кодом, не могут привести к росту объекта и увеличению его пространства.

Чтобы понять, почему это так, вы должны понимать разницу между объектом и ссылкой на объект . В Java вы можете никогда напрямую обращаться к объекту. Вы можете получить доступ к объектам только через ссылку на объект. Ссылка на объект похожа (но не совпадает) с адресом памяти. Все ссылки на объекты имеют одинаковый размер (или максимально возможный размер) независимо от размера объекта, на который они ссылаются. Если ваш setPrev метод был

void setPrev(Node p) {
   this.prev = p;
}

, который изменяет ссылку на объект this.prev для ссылки (указывает на) на тот же объект, что и ссылка на объект p. не копирует объект, на который ссылается p, в this объект.

0 голосов
/ 08 ноября 2018

Память кучи используется объектом Java, включая:

  • Примитивные поля: Integer, String, Float и т. Д. Они имеют фиксированную длину в памяти.
  • Поля объекта (например, ваш prev и next объект), они имеют по 4 байта для каждого, просто используются для хранения только ссылки. Когда вы установите sample.setPrev(new Node()), ваш prev будет сохранять ссылку на другое пространство памяти.
...