【问题标题】:How JVM stores meta information of a class?JVM如何存储类的元信息?
【发布时间】:2016-04-25 06:15:13
【问题描述】:

我们对用户定义的类 Employee 使用反射:

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

据我所知,首先 JVM 会加载 Employee 类的字节码,然后它还会为每个加载的类(此处为 Employee 类)创建一个 Class.class 对象。在 Class.class 的对象中,JVM 存储有关最近加载的类的元信息。

一个类的元信息有“方法名”、“字段名”等。这些类型如“方法”、“字段”等的类在java.lang.reflect包中定义。

我看到了 Class.java 的代码。我在 Class.class 中找到返回对象或这些类型的对象数组的方法,例如“方法”、“字段”等。但是 Class.class 中没有类型为“方法”、“字段”等的字段.

如果我的上述陈述是错误的,请纠正我。如果上述陈述没有错,那么我有以下疑问: 1)。在 Class.class 的哪个字段中存储有关类的各种信息? 2)。 Employee 的 JVM 对象和 Class.class 的对象存储在哪个内存区域? 3)。 Employee 的 JVM 字节码和 Class.class 的字节码存储在哪个内存区域?

【问题讨论】:

  • 为什么它对你很重要?

标签: java class reflection jvm


【解决方案1】:

Class.class 的哪个字段存储了一个类的各种信息?

此信息存储在 PermGen (

Employee 的 JVM 对象和 Class.class 的对象分别存放在哪个内存区域?

所有对象都存储在堆上。在 Eden 空间中创建较小的对象。

Employee 的 JVM 字节码和 Class.class 的字节码存放在哪个内存区域?

字节码存储在 PermGen/Metaspace 中,如果它被存储的话。理论上,虽然不是实践,但JVM可以根据需要重新读取类文件。

【讨论】:

  • 对于标准的类加载架构,JVM无法重新读取类文件,因为运行时类是通过ClassLoader.defineClass等创建的。接收字节数组或ByteBuffer,但没有关于这些字节来源的信息……Java 9 可能会改变这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 2013-02-19
  • 2011-07-10
  • 1970-01-01
  • 2013-10-30
  • 2014-10-18
相关资源
最近更新 更多