是否可以在java中的变量堆上获取地址?

时间:2011-01-10 20:05:42

标签: java pointers memory-management heap memory-address

让我说我有这个变量:

...
Somekindofobject var = new Somekindofobject();
...

我想知道var在堆上的位置(通过地址,如0x08等),并打印出地址。

有可能吗?

5 个答案:

答案 0 :(得分:8)

  

我正在研究一个得到的程序   输入java程序和仪器   打印到文件的代码   有关变量访问的信息。该   唯一的方法,我可以确定   两个相同的对象领域   class是在堆上的地址。   因此,我需要堆上的地址

您可以使用System.identityHashCode来获得相同的概念。 它并不完美,但它非常好。 如果确实获得了对象的堆地址,请记住允许JVM移动对象(并且经常在分代垃圾收集器将长期存在的对象提升为旧代时),因此对象的堆位置不是在所有情况下都是良好的身份代理。

答案 1 :(得分:3)

您可以尝试一下javaPaper的这篇文章:Address of a Java object

使用Unsafe包中的sun.misc类来获取地址。

答案 2 :(得分:1)

即使您设法获取对象的堆地址,也无法保证在您使用它时,对象仍然存在。垃圾收集器可以随时将对象移动到另一个位置。与.NET不同,java不支持内存固定。如果您希望将数据从本机代码推送到地址,DirectByteBuffer可能就是您所需要的。

答案 3 :(得分:1)

除了提到不安全之外,它很有用(我在生产环境中自己使用过它)。 还有另一种解决方案,它不会将Java地址作为本机指针返回,它被称为直接java.nio.ByteBuffer,它的设计完全符合这一想法。 它直接分配内存ByteBuffer没有在java堆中分配,它不是标准垃圾收集的主题。然后,当然,ByteBuffer通过ByteBuffer.address()

提供直接指针

答案 4 :(得分:0)

鉴于您的目标,我认为唯一的解决方案是JVMTI。您可以使用{SetTag}操作将唯一标识符与每个对象相关联。然后听{FieldModification}事件。