JVM崩溃时异常中显示的奇怪路径

时间:2016-01-28 08:37:06

标签: java jvm java-8 unsafe

运行

等代码后
public static void main(String... args) throws Exception {
    getUnsafe().getByte(0);
}

private static Unsafe getUnsafe() throws NoSuchFieldException, IllegalAccessException {
    Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
    theUnsafe.setAccessible(true);
    return (Unsafe) theUnsafe.get(null);
}    

导致JVM崩溃,然后查看记录的输出,在Internal exceptions部分下显示一些奇怪的路径:

    thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u60\4407\hotspot\srÚÞ ©Ö_®?
    thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u60\4407\hotspot\src\share\vm\prims\j

我绝对没有在我的本地计算机上使用这些路径,并且一些谷歌搜索显示它们经常在这些故障转储中结束。我假设它们来自最初编译JDK的时候。

我的问题是 - 这是正确的吗?为什么这些信息会被整合到JDK中?纯粹是为了稍后调试?

1 个答案:

答案 0 :(得分:5)

  

是正确的吗?

我是这么认为的。

  

为什么这些信息会被整合到JDK中?纯粹是为了稍后调试?

是的,原始路径存储在C / C ++的一些编译图像中,用于分析核心转储。

避免这些崩溃的一种方法是使用一个包装Unsafe的库,并确保只访问有效的内存区域。例如Chronicle-Bytes为64位内存大小执行此操作,并为二进制和文本数据提供线程安全访问。 (免责声明,我帮忙写了它)