【问题标题】:How to get the memory address(not the hashcode) of a java object using JVMTI如何使用 JVMTI 获取 java 对象的内存地址(不是哈希码)
【发布时间】:2011-12-28 17:48:36
【问题描述】:

我是 C 和 C++ 的初学者,我不太了解如何使用 JVMTI。我想获取 java 对象的物理内存位置(十六进制)。是否可以?我不想得到像“从这个分析器等得到它”这样的答案...... 到目前为止,我在 linux 终端中使用这个命令:

java -showversion -agentpath:../CPrg/DLL/bin/Debug/libDLL.so SimpleMemAlloc

libDLL.so 是我使用 c 创建的库,我在其中使用我的 java 应用程序运行它。它确实有效,它与我的代码一起运行,但我不知道如何获取我想要的数据。

例如我正在使用这个简单的代码:

public class SimpleMemAlloc{

    Object [] oarray = new Object[10000];

    public static void main(String args []){
        Object [] o= new Object[100];
        for (int i= 0; i<100; i++){
        o[i] = new Integer [10000];
        }
    }
}

我想获取我创建的每个新整数数组的内存位置 (0x...)... 如果我使用 jvmti 获得一个不错的示例代码,我会非常高兴

【问题讨论】:

  • 你知道对象可以在内存中移动吗? (虽然它们可以暂时固定。)
  • 是的,我知道……有什么办法可以在 JVMTI 中做到这一点……我不在乎他们下一秒是否移动……我只想找到他们的实际在那个特定时刻的记忆位置。
  • 我相信你实际上并不需要它。无论如何,sun.misc.Unsafe 就是您要搜索的内容。
  • 我已经尝试过 Unsafe 类,但我找不到数组的内存位置...如果我可以使用 Unsafe 类,如果您告诉我如何使用,我会非常高兴。但我相信 jvmti 是答案......这可能没有意义,但我真的需要这个,我正在研究一些东西,这个答案对我很有帮助

标签: java memory object jvmti


【解决方案1】:

如果对象没有覆盖hashCode(),默认实现将对象的内部地址作为整数返回。同样,这可能不是最好的方法。

这通常通过转换内部地址来实现 对象转换成整数,但这种实现技术不是 JavaTM 编程语言所要求的。

欲了解更多信息click here

【讨论】:

  • 这是错误的。对象的身份哈希码不是地址。身份哈希码是不变的,但地址可以改变。特别是当垃圾收集器复制对象以回收空间时。
猜你喜欢
  • 1970-01-01
  • 2015-03-26
  • 2013-05-01
  • 1970-01-01
  • 2019-02-23
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多