2011-01-10 58 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}事件。

相關問題