让我说我有这个变量:
...
Somekindofobject var = new Somekindofobject();
...
我想知道var在堆上的位置(通过地址,如0x08等),并打印出地址。
有可能吗?
答案 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}事件。