我希望JMC能够与OpenJDK,JDK11二进制文件一起使用,因为它已经由Oracle 11从Java 11开源,但无法在Oracle文件夹中找到Oracle和AdoptOpenJDK Java-11二进制文件.我也试过这个https://jdk.java.net/jmc/,因为有些文章说它是单独发布的.有谁知道如何获得OpenJDK-11的JMC.
在 JVM 加载字节码期间,使用以下代码片段面对此 java.lang.VerifyError。
try{
-----
} catch (NumberFormatException|CalculationException e) {
}
Run Code Online (Sandbox Code Playgroud)
这里 CalculationException 是自定义异常,它扩展了 java.lang.RuntimeException,而 NumberFormatException 是标准的 Java RuntimeException。虽然代码在本地 Windows 机器上编译并运行良好。
它在 QA/prod/Dev unix 节点之一上因验证错误而失败,并在其他 unix 节点上正常工作。尽管两个 unix 节点具有相同的配置(使用 RedHat 6.2 和 1.8 jdk 以及相同版本的 jar 文件),但也比较了 javap -c 在两个节点上生成的字节码,发现相同。
我还找到了两种在错误节点上解决此问题的方法。
1)由于此错误是在字节码验证步骤中出现的,因此尝试通过将 dev unix 框上的字节码验证禁用为 -Xverify:none (也尝试过 -XX:-UseSplitVerifier 但 dint 工作,因为我认为它已从 jdk 8 中禁用)但是,由于我们不会在 prod 中禁用字节码验证,因此一直在寻找其他一些解决方法。
2) 另一种解决方法是使用父异常:catch 块中的 RuntimeException 而不是组合两个异常。
我无法理解 Java 是否确实对这种捕获方式有问题,为什么编译器 dint 抱怨它以及为什么它可以在一台机器上运行而不是在具有相同配置的其他机器上运行。错误原因也没有意义,它说:CalculationException (current frame, stack[0]) is notassignable to 'java/lang/RuntimeException 虽然它实际上是可分配的,经测试
if (RuntimeException.class.isAssignableFrom(CalculationException.class)){
System.out.println("Assisgnable");
}
Run Code Online (Sandbox Code Playgroud)
完整的异常详细信息: …