运行
等代码后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中?纯粹是为了稍后调试?
答案 0 :(得分:5)
是正确的吗?
我是这么认为的。
为什么这些信息会被整合到JDK中?纯粹是为了稍后调试?
是的,原始路径存储在C / C ++的一些编译图像中,用于分析核心转储。
避免这些崩溃的一种方法是使用一个包装Unsafe的库,并确保只访问有效的内存区域。例如Chronicle-Bytes为64位内存大小执行此操作,并为二进制和文本数据提供线程安全访问。 (免责声明,我帮忙写了它)