Как выглядят объекты Java в JVM

Java задняя часть JVM NLP
Как выглядят объекты Java в JVM

предисловие

Java — это объектно-ориентированный язык разработки, так что же представляют собой объекты, созданные нашими собственными классами Java? Он определенно хранится в памяти виртуальной машины, но как он структурирован? Посмотрите вниз с вопросами.

О классе

Слой разработки Java может быть не знаком с классом, но точно знаком с классом, нам нужно только знать, что класс — это представление класса в JVM, то есть класс Java соответствует классу JVM. Отношение наследования в C++ выглядит следующим образом:

class MetaspaceObj
    class Metadata
        class Klass

Класс Klass используется для описания информации о классе Java, включая описание собственного макета типа, имени класса, родительского класса, дочернего класса, родственного класса и т. д.

О ОП

По способу, соответствующему предыдущему классу, объект тоже должен иметь соответствующее представление внутри JVM, верно? Правильно, это oop(обычный указатель на объект), обычный указатель на объект. Он определяется следующим образом:

typedef class oopDesc*                            oop;

Где класс oopDesc ​​является базовым классом для всех oops. В JVM для описания конкретных типов объектов используются разные операторы. Например, instanceOopDesc ​​используется для объектов класса, а arrayOopDesc ​​— для массивов.

Класс+уп модель

Структура объектов Java в JVM следующая, включая заголовки и содержимое объекта. Как показано на рисунке ниже, левый — это instanceOopDesc, объект общего класса. Заголовок включает идентификаторы и метаданные. Идентификаторы используются для хранения информации о записи времени выполнения, включая хэш-коды, блокировки сборщика мусора и блокировки потоков. Справа — arrayOopDesc, объект массива.Заголовок имеет дополнительную длину для записи длины массива.

这里写图片描述

прийти на демо

public class Test {

	private String[] flag = { "a", "b", "c" };
	private String name = "test";

	public static void main(String[] args) throws Exception {
		Test test = new Test();
		String _name = "test";
		System.out.println(test.flag);
		System.out.println(_name);
	}
}

структура объекта

Сделайте точку останова в приведенной выше программе, узнайте pid через jps, а затем используйте следующую команду, чтобы открыть hsdb и подключиться к JVM в соответствии с pid.

jhsdb hsdb

这里写图片描述

Глядя на стековую память основного потока, мы в основном хотим получить адрес объекта Test, то есть0x000000008a105dd0.

这里写图片描述

Затем используйте инспектор для просмотра0x000000008a105dd0oop, соответствующий адресу, видите, что этот oop представляет собой структуру объекта, сгенерированную нашим классом Test, включая метку и метаданные. Здесь может возникнуть вопрос, то есть разве не сказано, что у массива тоже есть длина для представления длины массива? Но переменная массива флагов на рисунке не видит длину.

这里写图片描述

На самом деле у массива oop нет длины, но С++ не объявляет эту переменную, а напрямую сохраняет длину массива в соответствующую память через указатель, поэтому здесь она невидима. Причину можно ясно понять по следующему конкретному коду реализации. Мы никак не можем увидеть это значение длины? Нет, давайте продолжим смотреть, как смотреть на это значение.

int length() const {
    return *(int*)(((intptr_t)this) + length_offset_in_bytes());
  }
  
void set_length(int length) {
    *(int*)(((intptr_t)this) + length_offset_in_bytes()) = length;
  }

Раньше мы могли получить адрес массива флагов oop как0x000000008a105de8. на 64-битной машине_mark8 байт,_metadataсоставляет 4 байта, затем добавьте 12 к адресу, чтобы получить0x000000008a105df4. Затем используйте проверку в командной строке hsdb, чтобы получить значение адреса, и получите0x8a105e080000000300000003Это.

hsdb> examine 0x000000008a105df4
0x000000008a105df4: 0x8a105e0800000003

------------- Рекомендуем прочитать ------------

Резюме моей статьи за 2017 год — машинное обучение

Краткое изложение моих статей за 2017 год — Java и промежуточное ПО

Резюме моих статей 2017 года — глубокое обучение

Краткое изложение моих статей за 2017 год — исходный код JDK

Резюме моей статьи за 2017 год — обработка естественного языка

Резюме моих статей 2017 года — Java Concurrency


Поговори со мной, задай мне вопросы:

这里写图片描述

Меню официальной учетной записи было разделено на «Сводка для чтения», «Распределенное», «Машинное обучение», «Глубокое обучение», «НЛП», «Глубина Java», «Ядро параллелизма Java», «Исходный код JDK», "Tomcat Core" "Подождите, может быть, есть тот, который соответствует вашему аппетиту.

Зачем писать «Анализ проектирования ядра Tomcat»

Добро пожаловать, чтобы следовать:

这里写图片描述