Комикс: Как был найден предмет? ручка ИЛИ прямой указатель?

Java

img
img
img
img
img
img
img
img
img
img
img
img

img

img
img
img
img
img
img

Совет: Чтобы использовать и находить объекты Java, вам необходимо использовать стек виртуальной машины Java, который описывает модель памяти потока выполнения метода Java: при выполнении каждого метода кадр стека виртуальной машины Java будет создан синхронно для хранения таблица локальных переменных, стек операндов, динамическое соединение, выход из метода и другая информация. Процесс каждого вызываемого метода до завершения выполнения соответствует процессу помещения кадра стека в стек в стеке виртуальной машины.

Интерпретация кода

Возьмите следующий код в качестве примера, чтобы проиллюстрировать процесс позиционирования объекта:

class Bus extends Car {
    private String code;
    private String color;
    Bus(String code, String color) {
        this.code = code;
        this.color = color;
    }
    // 省略其他方法...
}
public class ReferenceTest {
    Bus myBus = new Bus("Java中文社群", "蓝色");
}

Для официальной виртуальной машины HotSpot по умолчанию:myBusэто переменная типа ссылка, хранящаяся в таблице локальных переменных,new Bus("Java中文社群", "蓝色")Это данные экземпляра объекта, хранящиеся в куче Java, в которой хранится вся информация о полях этого класса сущностей, напримерcode="Java中文社群"так же какcolor="蓝色"и другую информацию, а адрес данных типа объекта также хранится в куче Java, в которой хранится информация о типе объекта, а также информация о его родительском классе.

Суммировать

Поскольку ссылочный тип только указывает, что это ссылка на объект в Спецификации виртуальной машины Java, он не определяет, как ссылка должна быть расположена и доступ к определенному местоположению объекта в куче, поэтому метод доступа к объекту также определяется виртуальным. В зависимости от реализации машины основные методы доступа в основном включают использование дескрипторов и прямых указателей:

  • Если используется доступ к дескриптору, часть памяти может быть разделена в куче Java как пул дескрипторов, а адрес дескриптора объекта хранится в ссылке, а дескриптор содержит конкретную информацию об адресе данных и типе экземпляра объекта. данные;
  • Если используется прямой доступ по указателю, структура памяти объекта в куче Java должна учитывать, как разместить соответствующую информацию о данных типа доступа. Адрес объекта хранится непосредственно в ссылке. Если осуществляется доступ только к самому объекту, нет необходимости в более косвенном доступе.

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

Поскольку доступ к объектам в Java очень частый, такие накладные расходы также являются очень значительными затратами на выполнение, поэтому официальная виртуальная машина HotSpot по умолчанию использует «прямой указатель", чтобы найти объект.

Ссылки и благодарности

Чжоу Чжимин "Углубленное понимание виртуальной машины Java", 3-е издание

Подпишитесь на официальный аккаунт «Java Chinese Community» и ответьте на «Галантные товары», чтобы получить 50 оригинальных галантерейных товаров.Топ-лист.