предисловие
заJVM
После определенного понимания области выполнения этой статьи далее введут детали данных в памяти виртуальной машины. отJVM
виртуальная машина(Hotspot
) области памятиJava
Куча как пример для обсужденияJava
как кучасоздать объект,какобъект макетаи какобъект доступаиз.
текст
(1) Создание объекта
Говоря о создании объекта, сначала давайте посмотримJava
Существует несколько методов создания объектов, представленных в:
Header | объяснять |
---|---|
Используйте новое ключевое слово | конструктор называется |
Используйте метод newInstance класса | конструктор называется |
Используйте метод newInstance класса Constructor | конструктор называется |
Используйте метод клонирования | конструктор не вызывается |
использовать десериализацию | конструктор не вызывается |
Следующие примеры иллюстрируют работу пяти методов:
Employee.java
public class Employee implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
private String name;
public Employee() {}
public Employee(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Employee other = (Employee) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Employee [name=" + name + "]";
}
@Override
public Object clone() {
Object obj = null;
try {
obj = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return obj;
}
}
1. новое ключевое слово
Это самый распространенный и простой способ создания объектов. Таким образом мы можем вызывать произвольные конструкторы (как без аргументов, так и с аргументами).
Employee emp1 = new Employee();
Employee emp1 = new Employee(name);
2. Метод newInstance класса Class
Мы также можем использоватьClass
КатегорияnewInstance
способ создания объекта. этоnewInstance
вызов методаНет параметровКонструктор создает объект.
- метод первый:
Employee emp2 = (Employee) Class.forName("org.ostenant.jvm.instance.Employee").newInstance();
- Способ второй:
Employee emp2 = Employee.class.newInstance();
3. Метод newInstance класса Constructor
иClass
КатегорияnewInstance
Метод очень похож,java.lang.reflect.Constructor
В классе также естьnewInstance
методы создания объектов. мы можем пройти этоnewInstance
вызов методас параметрамисуммачастныйизКонструктор. в,Constructor
можно получить в соответствующемClass
полученный на уроке.
Constructor<Employee> constructor = Employee.class.getConstructor();
Employee emp3 = constructor.newInstance();
Эти два метода newInstance и есть то, что мы называем отражением. Фактически, метод newInstance класса Class вызывает метод newInstance класса Constructor внутри.
4. Метод клонирования
Всякий раз, когда мы вызываем объектclone
метод,JVM
Будет создан новый объект, и все содержимое предыдущего объекта будеткопироватьиди в. использоватьclone
Метод создает объект и не вызывает никаких конструкторов.
чтобы использоватьclone
метод, нам нужно реализоватьCloneable
интерфейс и реализовать его определенныйclone
метод.
Employee emp4 = (Employee) emp3.clone();
5. Десериализация
когда мыСериализацияидесериализоватьобъект,JVM
создаст намв одиночествеОбъект. При десериализацииJVM
Создание объекта не вызывает никаких конструкторов.
Чтобы десериализовать объект, нам нужно, чтобы наш класс реализовалSerializable
интерфейс.
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(emp4);
ByteArrayInputStream in = new ByteArrayInputStream(oos.toByteArray());
ObjectInputStream ois =new ObjectInputStream(in);
Employee emp5 = (Employee) in.readObject();
Эта статья начинается сnew
ключевые слова в качестве примера расскажитеJVM
Процесс создания экземпляров объекта в куче выглядит следующим образом:
-
Когда виртуальная машина сталкивается с
new
команда, она сначала проверяет этопараметры командыможет быть впостоянный пулнайти одинСимволическая ссылка. затем проверьте этоСимволическая ссылкаЯвляется ли байт-код-подобный объектЗагрузить, разобрать и инициализировать. Если нет, будет выполнен соответствующий процесс загрузки класса. -
загрузка классаПосле завершения виртуальная машина станет новым объектомраспределятьОбласть памяти, размер требуемого объекту пространства памяти определяется после загрузки класса.
-
выделение памятиПосле завершения виртуальная машина инициализирует выделенное пространство памяти какнулевое значение.
-
Виртуальная машина выполняет ряднастраивать,какМетаинформация класса, к которому он принадлежит,хэш-код объекта,Объект GC Banding Возраст,замок держится на нитке,Идентификатор цепочки смещенияи другая информация. Эта информация хранится взаголовок объекта (
Object Header
).
После завершения вышеуказанной работы с точки зрения виртуальной машины был создан новый объект. Однако изJava
С процедурной точки зрения создание объекта только началось.
## (два).Разметка объекта
HotSpot
В виртуальной машине расположение объектов, хранящихся в памяти, можно разделить на три области:заголовок объекта(Header
),данные экземпляра(Instance Data
)иВыровнять отступы(Padding
).
заголовок объекта
существуетHotSpot
В виртуальной машине заголовок объекта состоит из двух частей информации:данные времени выполненияиуказатель типа.
1. Данные времени выполненияИспользуется для хранения собственных данных времени выполнения объекта, таких какхэш-код(хэш-код),GC Banding Возраст,замок держится на нитке,Идентификатор цепочки смещенияи другая информация.
Длина этой части данных32
битовая сумма64
В виртуальной машине с небольшим количеством места (не считая пока сценария с включенным сжатым указателем) они32
и64
КусокBit
, официально называется“Mark Word”
.
Когда объект не заблокирован в 32-битной виртуальной машине HotSpot, 25 бит из 32-битного пространства Mark Word используются для хранения хэш-кода объекта (HashCode), 4 бита используются для хранения возраста создания объекта и 2 бита используются для хранения возраста создания объекта.Бит флага блокировки, 1 бит фиксируется на 0.
Содержимое хранилища объектов в других состояниях (упрощенная блокировка, усиленная блокировка, метка GC, отклоняемый) показано в следующей таблице:
хранить содержимое | бит флага | государство |
---|---|---|
Хэш-код объекта, возраст генерации объекта | 01 | не заблокирован |
указатель на блокировку записи | 00 | Легкий замок |
указатель на тяжеловесный замок | 10 | Вздутие живота (тяжелый локаут) |
Пусто, нет необходимости записывать информацию | 11 | маркер ГХ |
Идентификатор потока смещения, отметка времени смещения, возраст создания объекта | 01 | может быть предвзятым |
2. Введите указательк объекту экземпляраметаданные классаВиртуальная машина использует этот указатель, чтобы определить, экземпляром какого класса является объект.
если объект являетсяJava
массив, то естьзаголовок объектаТакже должен быть блок для записидлина массиваДанные.
данные экземпляра
данные экземпляраЧасть, где объект фактически хранитсядостоверная информация, будь то изнаследование родительского классаЭто класс, который пришелсвоя, все нужно записывать, и эта частьпорядок храненияна виртуальной машинестратегия распределенияиопределенный порядокВлияние.
Стратегия распределения по умолчанию:
long/double -> int/float -> short/char -> byte/boolean -> reference
если установлено-XX:FieldsAllocationStyle=0
(по умолчанию1
),Тактип ссылкиСначала будет выделено место для хранения данных:
reference -> long/double -> int/float -> short/char -> byte/boolean
в заключении:
Политики распределения всегда располагаются в порядке убывания размера в байтах, а политики одинакового размера в байтах объединяются.
Выровнять отступы
HotSpot
Виртуальная машина требуетначальный адресдолжно быть8
Целые числа, кратные байтам, то есть размер объекта должен быть8
байтцелое кратное. ичасть заголовка объектаТочно8
кратное байтам (32
бит1
раз,64
бит2
раз), поэтому, когда часть данных экземпляра объекта не выровнена, необходимо передатьВыровнять отступыдополнять.
(3) Доступ к позиционированию объектов
Java
Программу нужно пройтиJVM
Ссылки на стек обращаются к конкретным объектам в куче. Доступ к объекту зависит отJVM
Реализация виртуальной машины. Текущие основные методы доступа:ручкаипрямой указательДва пути.
указатель:Указатель на объект, представляющий начальный адрес объекта в памяти.ручка:Его можно понимать как указатель на указатель, поддерживающий указатель на объект. Дескриптор указывает не прямо на объект, а указатель на объект (дескриптор не меняется и указывает на фиксированный адрес памяти), а затем указатель объекта указывает на реальный адрес памяти объекта.
1. Ручка
Java
Блок памяти выделяется в куче какручка пула, который относится к объекту, хранящемуся вадрес обработки, а дескриптор содержитданные экземпляра объектаиданные типа объектаСоответствующийКонкретный адресИнформация, конкретная структура показана на следующем рисунке:
Преимущество: хранится в ссылкестабильностьАдрес дескриптора, который меняется только при перемещении объекта (перемещение объектов — очень распространенное поведение при сборке мусора).ручкаизуказатель данных экземпляра,иЦитироватьНикаких модификаций как таковых не требуется.
2. Прямой указатель
При использованиипрямой указательдоступ,Цитироватьхранится непосредственно вадрес объекта,ТакJava
Компоновка внутри объекта кучи должна учитывать, как разместить доступтип данныхсвязанная информация.
Преимущество: Быстреебыстрый, СохраненоПозиционирование одним указателемстоимость времени. Поскольку доступ к объекту находится вJava
встречается очень часто, поэтому такие накладные расходы могут привести к очень значительным затратам на выполнение.
Ссылаться на
Чжоу Чжимин, Глубокое понимание виртуальной машины Java: расширенные функции и лучшие практики JVM, Machinery Industry Press
Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack
Эта учетная запись будет продолжать делиться сухими продуктами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.