gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:00:36 24 4
gpt4 key购买 nike

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

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

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

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

  1. 引用对象A类{}B 类扩展 A {}

A obj = new B();

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

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

“引用”---->“对象”“A”、“B”。

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

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

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

希望有人能说清楚..

最佳答案

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

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

This is just 4 bytes information.

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

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 在何处保存有关引用和对象类型的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37416073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com