Java在内存中的含义是什么

pp.*_*pp. 7 java memory

我是java新手,还在学习.我抓住了内心和匿名课程.现在我有一个关于java在内存中的样子,分配对象,定义类等的技术问题.

就像当一个字段是一个在外部类和内部类中定义的对象时,内存看起来像什么.静态类看起来与非静态不同吗?

我只需要一个视觉参考.

多谢你们

Die*_*Epp 3

详细信息在实现中(而不是规范)。然而,这些实现通常遵循非常简单的模式。Java中的大部分内存布局都非常简单明了。我的术语可能与 Java 术语不匹配,因为我没有进行大量 Java 编程。

一般来说,一个对象以指向其 vtable 的指针开始,然后是一系列字段。字段可以是原始类型(int/bool/float),也可以是指向对象的指针。这就是对象的情况。(类也是对象。)空指针就像 C 语言一样,它们是无效的,而不像 Python,其中 None 是对象。

在内部类中,有一个额外的隐藏字段指向外部类的实例。这就是内部类访问外部类中数据的方式。匿名类的工作方式相同。静态方法只是类上的方法,而不是实例上的方法。

vtable 是所有魔法发生的地方。每个类都有自己的在所有对象之间共享的 vtable。vtable 包含有关类的信息,例如其实例的大小以及字段的布局方式。该信息由垃圾收集器使用。vtable 还有一个指向该类实现的所有方法的指针。当调用方法时,运行时首先从对象中抓取vtable指针,然后从vtable中抓取方法指针,然后调用该方法并将对象作为隐式参数传递给方法。它与 C++ 类似,但实现起来更简单。如果方法或类是“final”,则可以跳过该过程。

我知道Java并没有真正的“指针”,它有“符号句柄”或类似的东西,但常见的实现只是使用普通的旧指针。