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

cygmwpex  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(91)

我正在努力加深我对Java内存模型和JVM的了解。
基本概念很简单,但我不明白JVM在哪里保存了关于原语、对象和引用的类型的信息。
比如说,
1.变量int i = 0该值存储在线程的堆栈中。这只是一个4字节,包含RAM或/和CPU缓存中的值0x0000。但它不包含任何关于它的类型的信息。假设你可以直接访问内存中的这些字节。你不能确定它是一个整数。据我所知,你不能说它的类型。这只是4个字节的信息。
因此,JVM必须在其他地方保存一些关于其类型的信息,但是JVM在哪里以及如何保存它呢?
1.参照物

class A {}
class B extends A {}

A obj = new B();

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

| stack |        |HEAP|         |PermGen|

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

引用位于堆栈中,具有类型“A”,但引用仅包含存储“Object”的信息。它有8个字节(如果JVM使用小于32 GB,可以压缩到4个字节)。它在这8个字节中没有关于它的类型的任何信息。
“对象”位于堆中并且具有类型“B”。我不知道它有没有关于它的类型的任何信息...
1.泛型引用。

List<String> list = new ArrayList<>();

JVM在哪里以及如何保存关于对象和引用的每种类型的信息?

ezykj2lf

ezykj2lf1#

我不明白JVM在哪里保存了关于原语、对象和引用的类型的信息。
JVM有一个空间(Perm Gen或Metaspace),用于记录所有类型信息和代码。
这只是4个字节的信息。
是的,它可以是一个布尔值,一个整数或者一个32位的引用。最有可能的是它在一个寄存器中,这意味着它甚至不使用任何内存。
JVM必须在其他地方保存一些关于其类型的信息,但是JVM在哪里以及如何保存这些信息呢?
实际上并没有。如果每次访问都要查找这样的信息,那将是极其缓慢的。相反,它有机器代码,将4字节的值放入寄存器,然后假设它是它期望的类型。
它唯一需要跟踪的是哪些寄存器保存引用,哪些寄存器保存原语。它需要它来执行GC。
正在运行的代码可以具有关于哪些寄存器和哪些堆栈位置具有引用的元信息。除非重新编译代码,否则不会动态分配寄存器。
泛型引用。list = new ArrayList(); JVM在哪里以及如何保存关于对象和引用的每种类型的信息?
泛型是编译时的特性。
有一些信息可以在运行时获得,但是这在对象上不可用,只能在类上获得。

相关问题