当前位置:正文

况且通过援用 foo 指向这个对象官网入口

发布日期:2024-05-29 15:59    点击次数:129

 官网入口[[321609]]

要道员最不缺的即是对象,每天皆会给我方创建成百上千的对象。关联词你竟然了解你的对象吗?比如以下类代码:

 

上头代码,在main设施中通过 new 重要字创建了Foo类的实例对象,况且通过援用 foo 指向这个对象。那么它们以及静态变量staticValue和实例变量localValue皆是被保存在内存中什么位置,以及它们是以何种时势存在的呢?

Java OOP-Klass 模子

JVM自己是用C艹收尾的,一个Java对象在是怎么映射到C层的对象呢?

最浮浅的作念法是为每个Java类生成一个结构疏导c++类与之对应。

但HotSpot JVM并莫得这样作念,而是缱绻了一个OOP-Klass Model。这里的 OOP 指的是 Ordinary Object Pointer (普通对象指针),它用来暗意对象的实例信息。而 Klass 则包含元数据和设施信息,用来描述Java类。

之是以遴选这个模子是因为HotSopt JVM的缱绻者不念念让每个对象中皆含有一个vtable(虚函数表),是以就把对象模子拆成klass和oop,其中oop中不含有任何虚函数,而Klass就含有虚函数表,不错进行method dispatch。

OOP-Klass模子 分为OOP框架和Klass框架

Klass 包含元数据和设施信息,用来描述Java类。

Klass是用来暗意class的元数据,包括常量池、字段、设施、类名、父类等。Klass 对象中含有虚函数表vtbl 以及父类虚函数表klass_vtbl, 因此不错字据java对象的实例类型设施的分发。

JVM 在加载class字节码文献时,会在设施区创建Klass对象,其中 instanceKlass 不错以为是 java.lang.Class 的VM级别的暗意,但它们并不等价,其结构如下图所示,

 

上图中的统共全局变量会在class字节码融会阶段完成赋值,主如若将常量池中的标记援用和解为平直援用,即运行时内容内存地址。

OOP 指的是普通对象指针,用来暗意对象的实例信息

统共的 OOP 类的共同基类为 oopDesc 类。它的结构如下:

 

当在Java中使用 new guan'jian创建一个对象时,就会在JVM中创建一个 instanceOopDesc 实例对象。Foo中的localValue即是保存在这个对象当中。

咱们平方说Java对象在内存中的布局分为:对象头、实例数据、对其填充。其实这3部分即是对应上头图中的 oopDesc 对象。

_mark和_metadata 通盘构成了对象头部分:

Mark Word:instanceOopDesc 中的 _mark 成员,允许压缩。它用于存储对象的运行时记载信息,如哈希值、GC 分代年事(Age)、锁情景标识(偏向锁、轻量级锁、分量级锁)、线程执有的锁、偏向线程 ID、偏向工夫戳等。 元数据指针:instanceOopDesc 中的 _metadata 成员,它是麇集体,不错暗意未压缩的 Klass 指针(_klass)和压缩的 Klass 指针。对应的 klass 指针指向一个存储类的元数据的 Klass 对象。

在对象头之后,JVM会连续填充Java对象中的具体实例数据,比如Foo中的localValue。

Foo具体分析

接下来从头回到著述开首的实例代码,Foo.java中包含两个变量staticValue和localValue,但是唯有staticValue会在类加载阶段由JVM分派内存并启动化默许值,因此现代码引申到第7行时,内存中只会在设施区创建Klass对象,用来描述Foo信息以及staticValue值,如下图所示:

 

不错看出,此时堆内存中并莫得创建Foo对应的instanceOopDesc实例对象。

现代码引申到第9行,调用 new 创建Foo时,JVM 就会创建一个 instanceOopDesc 对象暗意这个对象的实例,然后进行 Mark Word 的填充,将元数据指针指向刚才在设施区创建的 Klass 对象,并填充实例变量。况且因为设施是在main设施中引申,统共foo指针会被保存在捏造机栈中,并指向创建的 instanceOopDesc 对象。具体经过如下:

 

 

 

 

不错看出 localValue 是被保存在堆中的。

要而论之:

foo是一个局部设施中的援用,被保存在捏造机栈中 staticValue静态变量在类加载阶段被保存在设施区,并被赋值 localValue 实例变量是在创建对象时才会被创建并赋值 一个Java对象在JVM中被分红2部分:OOP和Klass。其中OOP对象保存对象里实例数据,Klass用来描述类有关信息以及保存静态变量。

 





Powered by 🏆华体汇·体育全站app官网入口(中国)官方网站IOS安卓/通用版/手机版APP下载 @2013-2022 RSS地图 HTML地图