1

可能重复:
如何获取 Java 对象的地址?
Java中变量的内存地址

Java中有没有办法查看或写入对象的堆地址。假设我有一个长对象

Long mylong = Long.valueof(1);

我想查看 mylong 的堆地址而不是它的值 (1)。我只是好奇这是否可能!我知道这是可能的,并且可能在应用程序中没有用。但我只是在寻找一种方法来了解 JVM 在某些情况下是如何工作的。

如果你是一个像 Eclipse 插件这样的工具,如果你让我知道,我将不胜感激!

4

2 回答 2

1

Java中有没有办法查看或写入对象的堆地址

简短的回答;不。

长答案是;你不想,因为它没用。您可以使用 Unsafe 获取此信息,但参考可以随时更改。

注意:引用是 32 位 Java 中的地址,但在 64 位 Java 中,引用通常乘以 8 和/或偏移量,以允许 JVM 对最多 32 GB 的堆使用 32 位引用。

于 2012-08-30T14:10:32.910 回答
1
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);

    }
}

取自:取自这里

于 2012-08-30T14:10:51.070 回答