Что такое Klass & KlassKlass
Что такое Klass
и KlassKlass
в реализации JVM Hotspot?
Насколько я понял из статьи Представляя Пермское поколение, Klass
является внутренним представлением класса Java (скажем A
), и он будет содержать основную информацию о структуре класса, включая байт-код. Он будет храниться как сам объект. Каждый объект класса A будет иметь указатель на внутреннее представление Klass
, присутствующее в PermGen
KlassKlass - это внутреннее представление самого класса Klass
. Почему требуется KlassKlass
? Какую дополнительную информацию он хранит?
Кроме того, указатель KlassKlass's
Klass
указывает на себя, я тоже этого не понял.
Ответы
Ответ 1
Постоянное поколение a.k.a permgen - это ссылка на место, где хранится вся относящаяся к классу информация. Иногда это называют областью метода.
Давайте рассмотрим пример следующего кода:
public class Parent
{
...
}
Здесь:
-
new Parent()
является объектом класса Parent
.
-
(new Parent()).getClass()
относится к Klass
для родителя. Тип ссылки для этого объекта будет java.lang.Class<Parent>
. Это сохранит информацию о Parent
аннотации, конструкторы, поля, методы, его наследование (суперкласс, интерфейсы) и т.д.
- Класс KlassKlass будет
(new Parent()).getClass().getClass()
. Тип ссылки для этого объекта будет java.lang.Class<java.lang.Class>
. Это определяет информацию о java.lang.Class
аннотации, конструкторы, поля, методы, его наследование (суперкласс, интерфейсы) и т.д.
Теоретически эта цепочка может продолжаться, но класс KlassKlassKlass будет таким же, как KlassKlass.
Включение, KlassKlass означает, что у вас будет один объект java.lang.Class
, который определяет поведение самого java.lang.Class
.
Надеюсь, что это поможет
Ответ 2
У вас, похоже, хорошее понимание управления хранилищами в HotSpot. Чтобы получить более конкретные детали, неплохо пойти на лошадиный рот - в этом случае разработчики HotSpot. Эта страница - это описание системы управления хранением.
В ситуациях, когда я хочу узнать, какой код я пытаюсь найти и найти код и прочитать его. В этом случае мы можем найти реализацию класса KlassKlass здесь. Это, похоже, не добавляет дополнительную информацию поверх Klass - что очень интересно посмотреть. Обратите внимание, что KlassKlass
продолжается Klass
.
Так зачем нам это нужно? Ну, мы можем выделить иерархию Klass
конкретной программы как дерево, где один Klass
описывает другой. Все нуждается в описании, но мы не можем продолжать это так навсегда, нам нужно найти фиксированную точку, где вещь, которую мы используем для описания чего-либо, сама - поэтому мы можем остановиться!
Итак, в резюме KlassKlass
не делает ничего более полезного, чем существующее. Он должен существовать, но его существование разумно неинтересно.
Ответ 3
Класс может быть определен как шаблон/синяя печать, описывающая поведение/состояния, которые поддерживает объект своего типа.