2011-01-10 61 views
5

可以说我有这个变量:是否可以在java中获得一个变量堆的地址?

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

,我想知道其中var位于堆(按地址,像0x08的等),并打印出来的地址。

这可能吗?

+0

如果你想要做的只是打印对象,你知道它在堆上的位置有什么好处?你真的想完成什么? – Anon 2011-01-10 20:07:01

+0

@Anon:我想他的意思是把地址打印出来。 – 2011-01-10 20:08:28

+0

我正在做一个程序,获取作为输入Java程序,并打印出仪器代码文件信息有关变量访问。我可以确定同一个类的两个对象之间的唯一方法是通过堆上的地址。因此,我需要堆上的地址 – RanZilber 2011-01-10 20:09:03

回答

8

我工作的一个程序,得到作为 输入Java程序,仪器 代码打印出来的文件有关的变量访问 信息。 只有这样,我可以确定 两个字段相同的 类的对象是由堆上的地址。 因此,我需要堆

地址可以使用System.identityHashCode得到千篇一律的概念。 这不是完美的,但它很不错。 如果确实获得了对象的堆地址,请记住允许JVM移动对象(并且在世代垃圾回收器将长寿命对象提升为老一代时经常这样做),因此对象的堆位置不是在任何情况下都是一个很好的身份代理。

1

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

1

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

0

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

相关问题