【问题标题】:the memory address of objects in Java even with using of a tool [duplicate]即使使用工具,Java中对象的内存地址[重复]
【发布时间】:2012-08-25 06:57:55
【问题描述】:

可能重复:
How to get adress of a Java Object?
Memory address of variables in Java

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

Long mylong = Long.valueof(1);

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

如果你有一个类似 Eclipse 插件的工具,如果你让我知道,我将不胜感激!

【问题讨论】:

  • 有一些 unsafe() 方法。但它们不安全,也不快。它们与某些字段一起使用,并且地址是相对的。不是绝对的。然后你也必须坚持一些异常处理!唯一的好处是使用每个字节,无论变量的类型是什么。它类似于 malloc() 但没有 [i] 用法。您使用有开销的 setter 和 getter。
  • 我知道它可能不安全且没有必要,但我只想知道 JVM 是如何工作的。所以我不会在生产中使用它。

标签: java memory heap-memory


【解决方案1】:

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

简答;不。

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

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

【讨论】:

  • 你知道一个可以显示当前堆的工具吗?我不想在产品中使用它!我只是想了解 JVM 是如何工作的。不安全的方法对我没有用,因为我想像 jvm 一样创建对象
  • 我想说最好的工具是YourKit。您可以免费获得评估许可证。它允许您在程序运行时查看内存和 cpu 使用情况、创建对象的位置,并以图形方式查看堆转储。
【解决方案2】:
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);

    }
}

取自:taken from here

【讨论】:

  • 不确定这如何为您提供对象的地址。
  • allocateMemory 是地址,它很长。您将任何原始值或对象值放在那里并使用地址
  • 它是一些分配内存的地址,而不是对象。
  • 是的,我在对问题的第一条评论中说这是相对地址
  • allocatedMemory 是一个绝对地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多