Серия JVM (3) — Изучение объектов JVM

Java задняя часть Микросервисы JVM

предисловие

за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Процесс создания экземпляров объекта в куче выглядит следующим образом:

  1. Когда виртуальная машина сталкивается сnewкоманда, она сначала проверяет этопараметры командыможет быть впостоянный пулнайти одинСимволическая ссылка. затем проверьте этоСимволическая ссылкаЯвляется ли байт-код-подобный объектЗагрузить, разобрать и инициализировать. Если нет, будет выполнен соответствующий процесс загрузки класса.

  2. загрузка классаПосле завершения виртуальная машина станет новым объектомраспределятьОбласть памяти, размер требуемого объекту пространства памяти определяется после загрузки класса.

  3. выделение памятиПосле завершения виртуальная машина инициализирует выделенное пространство памяти какнулевое значение.

  4. Виртуальная машина выполняет ряднастраивать,какМетаинформация класса, к которому он принадлежит,хэш-код объекта,Объект 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

零壹技术栈

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