【问题标题】:What is Klass & KlassKlass什么是 Klass & KlassKlass
【发布时间】:2013-05-23 18:11:20
【问题描述】:
JVM 热点实现中的Klass 和KlassKlass 是什么?
据我从文章Presenting the Perm Generation 了解到,Klass 是Java 类的内部表示(比如说A),它将包含有关类结构的基本信息,包括字节码。它将作为对象本身存储。 A 类的每个对象都有一个指向 PermGen 中的内部表示 Klass 的指针
KlassKlass 是Klass 类本身的内部表示。为什么需要KlassKlass?它存储了哪些额外信息?
另外,一个KlassKlass'sKlass指针指向自己,我也没看懂。
【问题讨论】:
标签:
java
jvm
jvm-hotspot
permgen
【解决方案1】:
Permanent Generation 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 的开发人员。 This page是他们对存储管理系统的描述。
在我想找出一些代码的情况下,我会尝试找到代码并阅读它。在这种情况下,我们可以找到 KlassKlass 类here 的实现。这似乎并没有在Klass 之上添加额外的信息——这看起来很有趣。请注意,KlassKlass 扩展了 Klass。
那么我们为什么需要它呢?好吧,我们可以将特定程序的Klass 层次结构绘制为一棵树,其中一个Klass 描述了另一个。一切都需要描述,但我们不能永远这样下去,我们需要找到一个fixed point,我们用来描述某事的东西就是它本身——这样我们就可以停下来了!
所以,总而言之,KlassKlass 没有做任何比现有更有用的事情。它需要存在,但它的存在相当无趣。