【发布时间】:2016-05-24 14:08:01
【问题描述】:
我正在努力加深对 Java 内存模型和 JVM 的了解。
基本概念很简单,但我不明白 JVM 在哪里保存有关原语、对象和引用的类型的信息。
例如 1. 我们有变量 int i = 0。 该值存储在线程的堆栈中。这只是一个 4 字节,在 RAM 或/和 CPU 缓存中包含值 0x0000。但它不包含有关其类型的任何信息。 想象一下,您可以直接访问内存中的这些字节。你不能确定它是一个整数。据我了解,您对它的类型无话可说。这只是 4 个字节的信息。
因此,JVM 必须将一些关于其类型的信息保存在其他地方,但是 JVM 将其保存在何处以及如何保存呢?
- 参考对象 A类{} B 类扩展 A {}
A obj = new B();
在这种情况下,我们有这样的事情:
|堆栈 | |堆| |永久代|
“参考”---->“对象”“A”,“B”。
引用位于堆栈中,类型为“A”,但引用仅包含存储“对象”的信息。它有 8 个字节(如果 JVM 使用少于 32GB,可以压缩到 4 个字节)。在这 8 个字节中没有任何关于它的类型的信息。
“对象”位于堆中,类型为“B”。我不知道它是否有任何关于它的类型的信息......
- 带有泛型的引用。 列表列表 = 新的 ArrayList(); JVM 在哪里以及如何保存有关对象和引用的每种类型的信息?
希望有人能说清楚..
【问题讨论】:
-
您在网上提出的问题有很多教程、描述和解释。你已经看过哪里了?此外,您的问题似乎很广泛。
-
2.当它有地址时,它可以跟随该指针并从那里跟随类指针并检查。 dzone.com/articles/java-object-memory - 1 和 3 也将主要存储在类中,尽管有些检查可能是隐式的,因为编译器会阻止访问错误的类型。
-
顺便说一句:“Java 内存模型 (JMM) 通过确定在根据特定规则读取共享变量时可以观察到哪些值来描述程序的哪些执行是合法的。”这与对象或原语的内存布局无关。
-
很有用谢谢。
-
@Underbalanced,我试图从 JVM 和 JMM 规范中获取此信息。此外,Google 提供了很多 jvm 存储值的信息,但我没有找到它存储有关引用和原语的类型信息的信息。
标签: java jvm java-memory-model