Eva*_*les 2 java jvm unsafe java-8
运行代码后如
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);
}
Run Code Online (Sandbox Code Playgroud)
这会导致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
Run Code Online (Sandbox Code Playgroud)
我绝对没有在我的本地机器上使用这些路径,并且一些谷歌搜索显示它们经常在这些故障转储中结束.我假设它们来自最初编译JDK的时候.
我的问题是 - 这是正确的吗?为什么这些信息会被整合到JDK中?纯粹是为了稍后调试?
那是对的吗?
我这么认为.
为什么这些信息会被整合到JDK中?纯粹是为了稍后调试?
是的,原始路径存储在C/C++的一些编译图像中,用于分析核心转储.
避免这些崩溃的一种方法是使用一个包装Unsafe的库,并确保只访问有效的内存区域.例如,Chronicle-Bytes为64位内存大小执行此操作,并为二进制和文本数据提供线程安全访问.(免责声明,我帮忙写了)
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |