Совет: Чтобы использовать и находить объекты 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 оригинальных галантерейных товаров.Топ-лист.