Debug调试时 Object@xxx表示什么
0x01 摘要
再用IDEA等工具调试Java代码时,往往会看到类似Person@434这样的信息。关于@符号后面数字表示的含义,这里解释一下。

0x02 不是HashCode
首先这里要说下,这个数字不是HashCode,也不是其16进制形式。
Object对象有一个默认的toString方法如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
可以看到他将Object的hashCode转为了16进制格式输出。整体的输出格式和我们好奇的输出格式是一样的,但是值却不同:

这两者之间也没有什么进制转换关系,至少我没发现。。。
0x03 ObjectID
在stackoverflow发现了这个问题的答案:
Deciphering variable information while debugging Java
这个数字是ObjectID,隶属于JDWP(Java Debug Wire Protocol, Java调试线协议)。
JDWP被用来在debugger和他所调试的目标JVM之间通信。
JDWP是可选实现的,也就是说一些JDK的实现版本没有JDWP。
实现了JDWP,可以允许相同debugger工作在以下位置:
- 同一台计算机上的不同进程中
- 在远程计算机上
ObjectID 最多8字节,具体由VM指定。ObjectID可以唯一标识目标VM中的对象。 一个特定对象将通过JDWP命令中的一个objectID来标识,整个生命周期中不变,除非已经明确处理完了一个ObjectID,否则不会重复使用ObjectID来标识不同的对象,无论引用的对象是否已被垃圾回收。
objectID为0表示null对象。
注意,对象ID的存在不会阻止对象的垃圾回收。 任何使用其对象ID访问垃圾收集对象的尝试都将导致INVALID_OBJECT错误代码。 可以使用DisableCollection命令禁用垃圾收集,但通常不需要这样做。
更多信息,请参考Java Debug Wire Protocol
Debug中ObjectID解析
本文解释了在IDEA等工具中进行Java代码调试时遇到的Object@xxx格式的含义。详细介绍了ObjectID的概念,它是JDWP协议的一部分,用于唯一标识JVM中的对象,即使在垃圾回收后也能保持不变。
1万+

被折叠的 条评论
为什么被折叠?



