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使用情况,在其中创建对象,并以图形方式查看堆转储。