Java Lambda实例引用$Lambda$15/0x...格式中斜杠/的含义是什么
JShell返回Lambda标识中斜杠及后续十六进制串的含义
你在JShell中看到的Lambda实例类名展示是HotSpot虚拟机(OpenJDK系列默认虚拟机)的标准输出格式,斜杠是固定分隔符,前后部分的具体含义如下:
- 斜杠前的
$Lambda$15是Lambda动态生成类的逻辑可读名称:其中数字15是当前JVM进程启动后,全局累计生成的Lambda匿名类的序号,每触发一次新的Lambda类生成逻辑,这个计数就会加1,方便人工识别区分不同Lambda。 - 斜杠后的十六进制字符串
0x00000008000a9440是该Lambda类在JVM元空间中的Klass结构指针地址:
由于Lambda类是JVM通过invokedynamic机制在运行时动态生成、仅存于内存中、不会持久化到磁盘的类,仅靠前面的计数序号无法全局唯一标识一个运行时Lambda类(不同类加载器、不同隔离上下文可能生成序号相同的逻辑Lambda名),这个十六进制值就是JVM内部存储该类元数据的直接内存地址,是全局唯一的类型标识,只要两个Lambda实例的这个值一致,就说明它们属于JVM中同一个动态生成的类型。
补充说明:你之前查到的@后的32e6e9c3本质是这个Lambda实例的对象身份哈希值(即Object.hashCode()默认返回值),部分调试环境中它和对象创建顺序相关是内存分配机制带来的附带效果,并非专门设计的顺序编号。另外要注意Lambda生成的动态类和传统匿名内部类(AIC)实现机制完全不同,$Lambda开头的类不属于匿名内部类范畴。
内容的提问来源于stack exchange,提问作者mellow-yellow
相关产品推荐
相关产品推荐

