JVM 在何处保存有关引用和对象类型的信息

Where JVM keeps information about reference and object types

我正在努力加深我在 Java 内存模型和 JVM 方面的知识。

基本概念很简单,但我无法理解 JVM 在哪里保存关于基元、对象和引用的类型信息。

例如 1. 我们有变量 int i = 0。 该值存储在线程的堆栈中。这只是 RAM or/and CPU 缓存中包含值 0x0000 的 4 个字节。但它不包含有关其类型的任何信息。 想象一下,您可以直接访问内存中的这些字节。你不能确定它是一个整数。据我了解,您不能对它的类型一无所知。这只是 4 个字节的信息。

因此,JVM 必须在其他地方保留有关其类型的一些信息,但是 JVM 在哪里以及如何保留它?

  1. 参考对象 class一个{} class B 扩展 A {}

A obj = new B();

在这种情况下,我们有这样的东西:

|堆栈 | |堆| |永久代|

"reference" ----> "Object" "A", "B".

引用位于堆栈中,类型为 "A",但引用仅包含存储 "Object" 的信息。它有 8 个字节(如果 JVM 使用少于 32GB,可以压缩到 4 个字节)。在这 8 个字节中它没有任何关于它的类型的信息。

"Object" 位于堆中,类型为 "B"。我不知道它是否有关于它的类型的任何信息...

  1. 泛型引用。 列表列表 = new ArrayList<>(); JVM 在何处以及如何保存有关对象和引用的每种类型的信息?

希望有人能说清楚..

I cannot understand where JVM keeps information about types for primitives, objects and references.

JVM有一个space(Perm Gen或Metaspace)记录所有类型信息和代码。

This is just 4 bytes information.

是的,它可以是布尔值、整数或 32 位 reference.Most 可能它在寄存器中,这意味着它甚至不使用任何内存。

JVM has to keep some information about its type in other place, but where and how JVM keeps it?

其实不是。如果它在每次访问时都查找此类信息,那将会非常慢。相反,它有机器代码,将一个 4 字节的值放入寄存器,然后假设它是它期望的类型。

它唯一需要跟踪的是哪些寄存器保存引用,哪些保存原语。它需要这个来执行 GC。

正在 运行 的代码可以包含有关哪些寄存器和哪些堆栈位置具有引用的元信息。除非重新编译代码,否则不会动态分配寄存器。

References with generics. List list = new ArrayList<>(); Where and how JVM keeps information about each type for objects and references?

没有。泛型是一个编译时特性。

您可以在 运行 时获得一些信息,但这在对象上不可用,仅在 类 上可用。