可能重复:
如何获取 Java 对象的地址?
Java中变量的内存地址
Java中有没有办法查看或写入对象的堆地址。假设我有一个长对象
Long mylong = Long.valueof(1);
我想查看 mylong 的堆地址而不是它的值 (1)。我只是好奇这是否可能!我知道这是可能的,并且可能在应用程序中没有用。但我只是在寻找一种方法来了解 JVM 在某些情况下是如何工作的。
如果你是一个像 Eclipse 插件这样的工具,如果你让我知道,我将不胜感激!
可能重复:
如何获取 Java 对象的地址?
Java中变量的内存地址
Java中有没有办法查看或写入对象的堆地址。假设我有一个长对象
Long mylong = Long.valueof(1);
我想查看 mylong 的堆地址而不是它的值 (1)。我只是好奇这是否可能!我知道这是可能的,并且可能在应用程序中没有用。但我只是在寻找一种方法来了解 JVM 在某些情况下是如何工作的。
如果你是一个像 Eclipse 插件这样的工具,如果你让我知道,我将不胜感激!
Java中有没有办法查看或写入对象的堆地址
简短的回答;不。
长答案是;你不想,因为它没用。您可以使用 Unsafe 获取此信息,但参考可以随时更改。
注意:引用是 32 位 Java 中的地址,但在 64 位 Java 中,引用通常乘以 8 和/或偏移量,以允许 JVM 对最多 32 GB 的堆使用 32 位引用。
import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class Direct {
public static void main(String... args) {
Unsafe unsafe = null;
try {
Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
unsafe = (sun.misc.Unsafe) field.get(null);
} catch (Exception e) {
throw new AssertionError(e);
}
long value = 12345;
byte size = 1;
long allocateMemory = unsafe.allocateMemory(size);
unsafe.putAddress(allocateMemory, value);
long readValue = unsafe.getAddress(allocateMemory);
System.out.println("read value : " + readValue);
}
}
取自:取自这里