什么是Klass
& JVM热点实现中的KlassKlass
?
据我在文章Presenting the Perm Generation中所理解,Klass
是Java类的内部表示(比方说A
)&它将保存有关类结构的基本信息,包括字节码。它将作为对象本身存储。 A类的每个对象都有一个指向PermGen中存在的内部表示Klass
的指针
KlassKlass是Klass
类本身的内部表示。为什么需要KlassKlass
?它存储了哪些额外信息?
此外,KlassKlass's
Klass
指针指向自身,我也不理解。
答案 0 :(得分:24)
永久生成a.k.a permgen是指存储所有类相关信息的地方。它有时被称为方法区域。
让我们举一个例子来说明以下代码:
public class Parent
{
...
}
下面:
new Parent()
是Parent
class。(new Parent()).getClass()
是指父母的Klass
。此对象的引用类型为java.lang.Class<Parent>
。这将存储有关Parent
的注释,构造函数,字段,方法,其继承(超类,接口)等的信息。(new Parent()).getClass().getClass()
。此对象的引用类型为java.lang.Class<java.lang.Class>
。这定义了有关java.lang.Class
的注释,构造函数,字段,方法,其继承(超类,接口)等的信息。理论上,这个链可以继续,但KlassKlassKlass与KlassKlass相同。
Inshort,KlassKlass意味着你将有一个java.lang.Class
对象来定义java.lang.Class
本身的行为。
希望这有帮助
答案 1 :(得分:2)
您似乎对HotSpot中的存储管理有一个很好的了解。为了获得更具体的细节,最好去马口 - 在这种情况下是HotSpot的开发者。 This page是他们对存储管理系统的描述。
在我想找出一些代码的情况下,我尝试找到代码并阅读它。在这种情况下,我们可以找到KlassKlass类here的实现。这似乎没有在Klass之上添加额外信息 - 这非常有趣。请注意,KlassKlass
扩展了Klass
。
那么我们为什么需要呢?好吧,我们可以将特定程序的Klass
层次结构绘制为树,其中一个Klass
描述另一个。{1}}。一切都需要描述,但我们不能永远这样,我们需要找到一个fixed point我们用它来描述某事物本身 - 所以我们可以停下来!
因此,总结KlassKlass
没有做比现有更有用的事情。它需要存在,但它的存在是相当无趣的。
答案 2 :(得分:-1)
可以将klass定义为模板/蓝图,描述其类型对象支持的行为/状态。