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 在哪里以及如何保留它?
- 参考对象
class一个{}
class B 扩展 A {}
A obj = new B();
在这种情况下,我们有这样的东西:
|堆栈 | |堆| |永久代|
"reference" ----> "Object" "A", "B".
引用位于堆栈中,类型为 "A",但引用仅包含存储 "Object" 的信息。它有 8 个字节(如果 JVM 使用少于 32GB,可以压缩到 4 个字节)。在这 8 个字节中它没有任何关于它的类型的信息。
"Object" 位于堆中,类型为 "B"。我不知道它是否有关于它的类型的任何信息...
- 泛型引用。
列表列表 = 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?
没有。泛型是一个编译时特性。
您可以在 运行 时获得一些信息,但这在对象上不可用,仅在 类 上可用。
我正在努力加深我在 Java 内存模型和 JVM 方面的知识。
基本概念很简单,但我无法理解 JVM 在哪里保存关于基元、对象和引用的类型信息。
例如 1. 我们有变量 int i = 0。 该值存储在线程的堆栈中。这只是 RAM or/and CPU 缓存中包含值 0x0000 的 4 个字节。但它不包含有关其类型的任何信息。 想象一下,您可以直接访问内存中的这些字节。你不能确定它是一个整数。据我了解,您不能对它的类型一无所知。这只是 4 个字节的信息。
因此,JVM 必须在其他地方保留有关其类型的一些信息,但是 JVM 在哪里以及如何保留它?
- 参考对象 class一个{} class B 扩展 A {}
A obj = new B();
在这种情况下,我们有这样的东西:
|堆栈 | |堆| |永久代|
"reference" ----> "Object" "A", "B".
引用位于堆栈中,类型为 "A",但引用仅包含存储 "Object" 的信息。它有 8 个字节(如果 JVM 使用少于 32GB,可以压缩到 4 个字节)。在这 8 个字节中它没有任何关于它的类型的信息。
"Object" 位于堆中,类型为 "B"。我不知道它是否有关于它的类型的任何信息...
- 泛型引用。 列表列表 = 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?
没有。泛型是一个编译时特性。
您可以在 运行 时获得一些信息,但这在对象上不可用,仅在 类 上可用。