java中的internal,java.lang.InternalError:编译的Java代码中最近的不安全内存访问操作中发生了错误...

此错误意味着sun.misc.Unsafe.getX()或putX()内存访问导致

SIGBUS错误,然后由JVM捕获并转换为异步InternalError.

更多细节:

> sun.misc.Unsafe是JDK私有API,允许直接从Java访问本机内存.此API是Direct ByteBuffers的基础,特别是MappedByteBuffers.

>在某些情况下,访问文件的内存映射区域可能会导致操作系统级异常,即SIGBUS.典型的例子是:

>在截断基础文件后访问内存映射缓冲区.

>网络驱动器上的文件已映射到内存,并且在网络连接丢失后访问映射的缓冲区.

>尝试写入映射到tmpfs文件系统上的文件的页面会导致内存不足(默认情况下,tmpfs空间受限于总RAM的50%).

> HotSpot JVM无法事先有效地检测到这些问题.它将Unsafe.getX / putX调用编译为简单的内存访问指令.检查内存区域是否有效的附加检查太昂贵了.

>而是JVM处理SIGBUG信号.如果它在Unsafe调用中发现错误,它会将InternalError发布到当前线程并继续执行.

> IOException更合适,但JVM不能抛出它或任何其他异常,因为ByteBuffer公共契约不允许其get / put方法抛出任何异常.

>如果在JIT编译的方法中不安全的内存访问失败,JVM不会立即抛出异常(同样,对于这样的热ByteBuffer API来说,它会太昂贵).相反,它将异步InternalError发布到当前线程.这意味着错误实际上会抛出最近的本机方法或最近的VM运行时调用.因此错误消息中的“最近”一词.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值