java - HotSpot LogCompilation 输出 : Should V (Void) match a java. lang.Object 返回类型?

标签 java jvm-hotspot

背景:我是名为 JITWatch 的 HotSpot LogCompilation 可视化工具的作者。我正在重构解析引擎。我有一个关于将 LogCompilation 方法签名与 Class.getDeclaredMethod() 签名匹配的问题,特别是关于匹配 void 返回类型的问题。

鉴于 HotSpot LogCompilation 输出片段:

<nmethod compile_id='48' compile_kind='c2n' entry='0x00007f01fc3f41c0'
size='328' address='0x00007f01fc3f4090' relocation_offset='296' 
consts_offset='328' insts_offset='304' 
method='java/lang/invoke/MethodHandle linkToStatic 
(Ljava/lang/Object;ILjava/lang/invoke/MemberName;)V' 
bytes='0' count='0' iicount='0' stamp='0.840'/>

这表示类 java.lang.invoke.MethodHandle 上方法 linkToStatic 的编译(使用 native 包装器),该方法以参数为参数

java.lang.Object, int, java.lang.invoke.MemberName 并返回 void

它可能在 java.lang.invoke.MethodHandle 上匹配的唯一方法具有签名:

static native java.lang.Object linkToStatic(java.lang.Object...) throws java.lang.Throwable;

其中具有 java.lang.Object 可变参数参数(与 LogCompilation 参数匹配),但声明了 java.lang.Object 返回类型。

将 LogCompilation 签名返回的 voidjava.lang.Object 匹配是否合法,原因是:

Object.class.isAssignableFrom(Void.class); // returns true

如果有人能解释 void 返回类型背后的机制,我将不胜感激。

谢谢

克里斯

最佳答案

linkToStatic 方法是 signature polymorphic method 。他们的签名因调用站点而异。

HotSpot 将在内部创建具有调用站点所需签名的新 Method 对象(请参阅 SystemDictionary::find_method_handle_intrinsic)。

您看到的此 nmethodmethod 属性是此类 Method 的字符串表示形式:其签名(包括返回类型)专门针对特定调用站点。

因此,一般来说,将 void 返回类型与 java.lang.Object 匹配是可以的,并且您可能需要特殊情况来匹配签名多态方法。

关于java - HotSpot LogCompilation 输出 : Should V (Void) match a java. lang.Object 返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26596358/

相关文章:

java - jstack 格式更改

System.out 中的 Java 执行细节

java - 如何从 Web 表单获取数据?

java - Jsoup 将双引号解析为 &quot,将单引号解析为双引号

java - 为什么 HotSpot 会使用提升来优化以下内容?

java - JVM 是如何决定 JIT 编译方法的(将方法归类为 "hot")?

java - 在接口(interface)的常量池中包含 java.lang.Object 的目的是什么?

java - 什么都不返回而不是 NaN

JavaFX SceneBuilder 2 相对路径异常

java - 如何使用 Java SWT .setBackground() 方法