JVM中的对象表示

ecd*_*dhe 3 java jvm memory-management

在Java®虚拟机规范的第2.7节"对象表示"中,它说:

在Oracle的一些Java虚拟机实现中,对类实例的引用是指向句柄的指针,该句柄本身是一对指针:一个指向包含对象方法的表和指向表示Class对象的指针对象的类型,另一个是从堆为对象数据分配的内存.

我的印象是句柄有三个指针而不是两个:

  • 一个指向包含对象方法的表的指针(在方法区域中).
  • 指向Class对象的指针,该对象表示对象的类型(在方法区域中).
  • 指向从堆分配的对象数据的内存的指针.

任何人都可以帮我解决这个困惑.

Ste*_*n C 6

首先,引用的文字说"在Oracle的一些Java虚拟机实现......".此描述对于所有实现都不正确.

它认为你的误解是基于对文本的错误解析.我认为实际上是这样说的:

  1. 句柄是指向一对指针的指针.
  2. 该对的第一个指针指向一个表.
  3. 该表包含该对象的方法.
  4. 该表包含指向该Class对象的指针.
  5. 该对中的第二个指针指向保存对象数据的存储区域.

手柄有两个指针,而不是三个.


我的理解是,在现代 Oracle JVM中,句柄的表示如下:

  1. 句柄是指向堆中节点的指针.
  2. 节点(对于普通对象)由两个标题字组成,后跟零个或多个保存对象数据的单词.
  3. 两个标题词包括以下内容:
    • "klass"一词包含JVM表类描述符表的索引
    • 标志字包含用于各种目的的位:例如GC"标记"位,表示对象的原始锁定状态的位,与标识哈希码相关的位,对象的GC年龄等.
  4. 类描述符包括方法表和Class对象的引用.它还给出了GC需要的实例数据区域的大小(以单词表示).

数组的表示有点不同.首先,有一个包含数组长度的第3个字.

(另请参阅java对象标头中的内容)


但请注意,这些细节是特定于实现的.特别是旗帜字.