You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JDK 8中使用jdb能否查看String对象的内存引用?

在JDB中查看Java对象引用/内存地址的方法

一、JDB内置命令区分对象引用

因为JDB的print命令对String会直接输出其toString()结果,你可以用以下两种方式判断变量是否指向同一对象:

  1. 使用dump命令
    执行dump str1和dump str2,会输出对象的详细元信息,其中包含JVM内部唯一的id字段,格式示例:

    java.lang.String id=2, value="Java", offset=0, count=4
    

    不同对象的id完全唯一,对比两个变量的id就能判断它们是否指向同一对象,逻辑和==运算符完全一致。

  2. 使用eval调用System.identityHashCode()
    在JDB中执行以下命令:

    eval System.identityHashCode(str1)
    eval System.identityHashCode(str2)
    

    该方法返回基于对象初始内存地址的哈希值(即使GC移动对象,该值也不会改变)。虽然存在极小的哈希碰撞概率,但绝大多数情况下,不同对象的返回值不同,可快速辅助判断引用是否相等。

二、获取对象内存地址的方式

JVM出于内存管理(如GC对象移动)和安全性考虑,默认不会直接暴露真实物理内存地址。不过针对HotSpot虚拟机,你可以使用JDK自带的**HSDB(HotSpot Debugger)**工具(无需外部库,属于JDK配套组件):

  • 启动调试时添加参数-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005开启调试端口,再用HSDB连接到目标JVM。
  • 在HSDB中定位到目标对象后,可查看其JVM内部的逻辑内存地址(注意:这是虚拟机层面的逻辑地址,并非物理内存地址,且GC可能会修改该地址)。

JDB本身没有类似readelf的命令直接输出内存地址,因为Java是托管语言,直接操作内存地址并非其设计目标。

内容的提问来源于stack exchange,提问作者Nicholas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:27:09