6

我目前正在为 Java 1.7 构建本机 JVMTI 代理。问题是我需要索引一些关于特定 Java 对象实例的数据。所以我的问题是我可以使用 jobject 类型的值作为对象的实例 ID 来检索我的索引数据吗?

我已经寻找有关什么是作业类型的语义的任何信息。它是对象内存位置的指针吗?它是堆栈指针地址吗?它是 JVM 内部结构的地址吗?所以我无法弄清楚 jobject 的值在 Java 对象的生命周期中是否是唯一且不可变的。

谢谢你的帮助。

编辑

根据此处找到的 JNI 规范,jobject 似乎是 Object 实例上的指针。

4

2 回答 2

2

当您说“jobject 类型的值”时,我猜您的意思是toString返回的值。如果您查看 java doc 它指出:

Object 类的 toString 方法返回一个字符串,该字符串由对象作为其实例的类的名称、at 符号字符“@”和对象哈希码的无符号十六进制表示形式组成。换句话说,此方法返回一个等于以下值的字符串:

    getClass().getName() + '@' + Integer.toHexString(hashCode())

如果您查看 Java 文档中的hashCode方法,它会指出:

每当在 Java 应用程序执行期间对同一对象多次调用时,hashCode 方法必须始终返回相同的整数

并且

在合理可行的情况下,由 Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但 JavaTM 编程语言不需要这种实现技术。)

更新:对 Ryan 评论的回应:即使 hashcode 方法被覆盖,System.identityHashCode也会为您提供原始哈希码。但是,就像评论一样,它并不是真正独一无二的。

所以我想你的问题的答案是肯定的,它是不可变的,而且很可能是独一无二的,但你应该阅读你的 JVM 的文档或源代码。

于 2012-03-10T00:27:33.753 回答
1

至少在 HotSpot 中,jobject 确实是一个指向对象位置的指针,也就是说,取消引用它会给你一个对每个对象来说都是唯一的地址,这是你所询问的“唯一且不可变的身份”的一半。问题是地址在垃圾收集期间会发生变化,因为 HotSpot 可以移动对象。

JVMTI GetTag 和 SetTag 函数在内部使用从对象位置到标记的哈希表。每当移动对象时,HotSpot 都会更新此哈希表,这是您无法从 JVMTI 代理的位置轻松复制的内容。正如您所说,您已经在使用标签分配您自己的唯一身份值,这可能是唯一的方法。

于 2013-02-23T19:39:40.187 回答