2016-04-25 2 views
2

Мы используем отражения для определенного пользователем класса Employee, как:Как JVM хранит метаинформацию о классе?

Employee e = new Employee(); 
Class c = e.getClass(); 

По моим сведениям первой виртуальной машины Java загружает байт-код класса Employee, то он также создать объект Class.class для каждого загруженного класса (класс Сотрудник здесь). В объекте класса Class.class JVM хранится метаинформация о недавно загруженном классе.

Мета-информация о классе - это «имя методов», «имя полей» и т. Д. Класс таких типов, как «Метод», «Поле» и т. Д., Определяется в пакете java.lang.reflect.

Я видел код класса.java. Я нашел методы в Class.class, которые возвращают объекты или массив объектов этих типов, таких как «Метод», «Поле» и т. Д. Но в классе Class.class нет поля, тип которого «Метод», «Поле» и т. Д. .

Если мои заявления выше не соответствуют действительности, пожалуйста, сделайте меня правильной. Если вышеприведенные утверждения не ошибаются, у меня возникают следующие сомнения: 1). В какой области Class.class хранится информация о классе? 2). В каком хранилище хранится область памяти объекта JVM Employee и объекта Class.class? 3). В какой области памяти байт-кода JVM Employee и байт-кода Class.class хранятся?

+0

Почему это для вас важно? – Holger

ответ

5

В каком поле Class.class хранится различная информация о классе?

Эта информация хранить от кучи в PermGen (< Java 7) или Метапространстве (Java 8+) Вы не можете видеть это Java напрямую.

В каком хранилище хранится область памяти объекта JVM Employee и объекта Class.class?

Все объекты хранятся в куче. В пространстве Eden создаются объекты меньшего размера.

В каком хранилище хранится информация о байт-коде JVM Employee и байт-кода Class.class?

Байт-код хранится в PermGen/Metaspace, если он вообще хранится. Теоретически, хотя и не на практике, JVM может перечитать файл класса по мере необходимости.

+1

Для стандартной архитектуры загрузки классов JVM не может перечитывать файл класса, поскольку класс среды выполнения создается через ['ClassLoader.defineClass'] (https://docs.oracle.com/javase/8/docs/ api/java/lang/ClassLoader.html # defineClass-java.lang.String-byte: A-int-int-) et al. получение байтового массива или 'ByteBuffer', но не информация об источнике этих байтов ... Java 9 может изменить это. – Holger

+0

@Holger Я квалифицировал это заявление. Хорошая точка зрения. +1 –

Смежные вопросы