【问题标题】:Where JVM keeps information about reference and object typesJVM 在哪里保存有关引用和对象类型的信息
【发布时间】:2016-05-24 14:08:01
【问题描述】:

我正在努力加深对 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. 带有泛型的引用。 列表列表 = 新的 ArrayList(); JVM 在哪里以及如何保存有关对象和引用的每种类型的信息?

希望有人能说清楚..

【问题讨论】:

  • 您在网上提出的问题有很多教程、描述和解释。你已经看过哪里了?此外,您的问题似乎很广泛。
  • 2.当它有地址时,它可以跟随该指针并从那里跟随类指针并检查。 dzone.com/articles/java-object-memory - 1 和 3 也将主要存储在类中,尽管有些检查可能是隐式的,因为编译器会阻止访问错误的类型。
  • 顺便说一句:“Java 内存模型 (JMM) 通过确定在根据特定规则读取共享变量时可以观察到哪些值来描述程序的哪些执行是合法的。”这与对象或原语的内存布局无关。
  • 很有用谢谢。
  • @Underbalanced,我试图从 JVM 和 JMM 规范中获取此信息。此外,Google 提供了很多 jvm 存储值的信息,但我没有找到它存储有关引用和原语的类型信息的信息。

标签: java jvm java-memory-model


【解决方案1】:

我不明白 JVM 在哪里保存有关原语、对象和引用的类型的信息。

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

这只是 4 个字节的信息。

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

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

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

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

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

带有泛型的引用。列表列表 = 新的 ArrayList(); JVM 在哪里以及如何保存有关对象和引用的每种类型的信息?

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

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

【讨论】:

  • "泛型是一种编译时特性。"实际上,在 Java 中,泛型不仅仅是一个编译时特性。
  • @Rogério 您可以通过反射从类中获取信息,但是它们在运行时不会做任何事情。
  • 他们在 C# 中也“不做任何事情”(没有擦除)。关键是要避免像“泛型是一个编译时特性”这样的短语,因为许多新手最终会相信所有泛型类型信息都会被编译器“擦除”并且在运行时不可用,当事实上,Java 反射 API 在 Java 5 中得到了极大的扩展,增加了新的方法等,支持运行时恢复和泛型类型信息的使用。
  • 感谢 Peter 的回答和所有提供 cmets 的人
  • @Rogério 是的,反射可用于类信息,但您无法获取实例的通用信息,只能获取它们作为示例的类。
猜你喜欢
  • 1970-01-01
  • 2017-03-19
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
相关资源
最近更新 更多