24

JVM 热点实现中的Klass&是什么?KlassKlass

据我在Presenting the Perm Generation一文中了解到,Klass它是 Java 类的内部表示(比方说A),它将包含有关类结构的基本信息,包括字节码。它将作为对象本身存储。A 类的每个对象都有一个指向KlassPermGen 中存在的内部表示的指针

KlassKlass 是Klass类本身的内部表示。为什么KlassKlass需要?它存储了哪些额外信息?

另外,一个KlassKlass's Klass指针指向它自己,我也不明白。

4

2 回答 2

28

永久代又名 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自身行为的对象。

希望这可以帮助

于 2013-06-11T20:22:27.160 回答
2

您似乎对 HotSpot 中的存储管理有一个很好的总体了解。要获得一些更具体的细节,最好去马嘴 - 在这种情况下是 HotSpot 的开发人员。此页面是他们对存储管理系统的描述。

在我想找出一些代码的情况下,我会尝试找到代码并阅读它。在这种情况下,我们可以在此处找到 KlassKlass 类的实现。这似乎并没有在Klass之上添加额外的信息——这看起来很有趣。请注意,KlassKlass扩展Klass.

那么我们为什么需要它呢?好吧,我们可以将Klass特定程序的层次结构绘制成一棵树,其中一个Klass描述另一个。一切都需要一个描述,但我们不能永远这样下去,我们需要找到一个固定点,我们用来描述某事的东西就是它本身——这样我们就可以停下来!

所以,总而言之KlassKlass,没有什么比现有的更有用的了。它需要存在,但它的存在相当无趣。

于 2013-06-11T23:10:49.917 回答