Java中对象的内存地址,即使使用工具也是如此

Java中对象的内存地址,即使使用工具也是如此,java,memory,heap,Java,Memory,Heap,可能重复: Java中是否有方法查看或写入对象的堆地址。说我有一个长长的目标 Long mylong = Long.valueof(1); 我想查看mylong的堆地址,而不是它的值(1)。我只是好奇这是否可能!我知道这是可能的,也可能在应用中没有用处。但我只是想知道JVM在某些情况下是如何工作的 如果你有一个像eclipse插件一样的工具,如果你让我知道的话,我将不胜感激 Java中是否有方法查看或写入对象的堆地址 简短的回答;没有 长答案是;你不想这么做,因为这没用。您可以使用“不安全

可能重复:

Java中是否有方法查看或写入对象的堆地址。说我有一个长长的目标

Long mylong = Long.valueof(1);
我想查看mylong的堆地址,而不是它的值(1)。我只是好奇这是否可能!我知道这是可能的,也可能在应用中没有用处。但我只是想知道JVM在某些情况下是如何工作的

如果你有一个像eclipse插件一样的工具,如果你让我知道的话,我将不胜感激

Java中是否有方法查看或写入对象的堆地址

简短的回答;没有

长答案是;你不想这么做,因为这没用。您可以使用“不安全”获取此信息,但引用可以随时更改

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

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);

    }
}

摘自:

有一些不安全的()方法。但它们既不安全也不快。它们与某些字段一起使用,并且地址是相对的。不是绝对的。然后你也必须坚持一些异常处理!唯一的好处是使用每个字节,不管变量的类型是什么。它有点像malloc(),但没有[i]用法。您使用的setter和getter有开销。可能重复:我知道这可能不安全,也没有必要,但我只想知道JVM是如何工作的。所以我不打算在生产中使用它。我不确定这如何给你一个对象的地址。allocateMemory是地址,它很长。您将任何原语或对象值放入其中,并使用地址它是某些已分配内存的地址,但不是对象。是的,我在对问题的第一次评论中说它是相对地址。
allocatedMemory
是绝对地址。您知道一个可以向我显示当前堆的工具吗。我不想在产品中使用它!我只是想了解JVM是如何工作的。不安全的方法对我来说没有用处,因为我想创建一个与jvm完全相同的对象。我认为最好的工具是YourKit。您可以免费获得评估许可证。它允许您在程序运行时查看内存和cpu使用情况,在其中创建对象,并以图形方式查看堆转储。