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

问题描述 投票:4回答:2

我想知道那里的某些JVM专家能否简要解释以下错误。从技术上讲,这实际上意味着什么,并且可能导致该错误的事件顺序是什么?

java.lang.InternalError: a fault occurred in a recent unsafe memory access operation in compiled Java code
java memory jvm
2个回答
11
投票

此错误意味着sun.misc.Unsafe.getX()putX()内存访问导致SIGBUS错误,该错误随后被JVM捕获并转换为异步SIGBUS

更多细节:

  • InternalError是JDK私有API,它允许直接从Java访问本机内存。该API是Direct ByteBuffers的基础,尤其是sun.misc.Unsafe
  • 在某些情况下,访问文件的内存映射区域可能会导致OS级异常,即MappedByteBuffers。典型示例为:

    1. 底层文件被截断后,将访问内存映射的缓冲区。
    2. 网络驱动器上的文件已映射到内存,并且网络连接丢失后,将访问映射的缓冲区。
    3. [尝试写入映射到SIGBUS文件系统上的文件的页面会导致内存不足(默认情况下tmpfs空间受限于总RAM的50%)。
  • HotSpot JVM无法预先有效地检测到这些问题。它将tmpfs调用编译为简单的内存访问指令。额外检查以查看内存区域是否有效将太昂贵。

  • 相反,JVM处理Unsafe.getX / putX信号。如果在SIGBUG调用中发现错误发生,则将Unsafe发布到当前线程并继续执行。
  • InternalError更合适,但JVM不能抛出它或任何其他异常,因为IOException公共协定不允许其ByteBuffer方法抛出任何异常。
  • 如果在使用JIT编译的方法中get/put内存访问失败,则JVM不会立即引发异常(同样,对于这种热字节缓冲区API而言,它太昂贵了)。而是将asynchronous Unsafe发布到当前线程。这意味着错误实际上是在最接近的本机方法或对VM运行时的最接近调用处引发的。因此,错误消息中的单词“ recent”

请参阅InternalError描述有关JDK错误的解决方案。


0
投票

此错误可能是由索引损坏引起的,而索引又由于JDK-4454115 comments而损坏了>

全部都是这样:

java.io.IOException: No space left on device

后接(可能是多次):

[2019-11-22 17:27:25,204] FATAL [Replica Manager on Broker 1]: Halting due to unrecoverable I/O error while handling produce request:  (kafka.server.ReplicaManager)
kafka.common.KafkaStorageException: I/O exception in append to log 'xxx-response-1-0'
    at kafka.log.Log.append(Log.scala:443)
    at kafka.cluster.Partition.$anonfun$appendRecordsToLeader$1(Partition.scala:451)
Caused by: java.io.IOException: No space left on device
    at sun.nio.ch.FileDispatcherImpl.write0(Native Method)
    at sun.nio.ch.FileDispatcherImpl.write(FileDispatcherImpl.java:60)
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
    at sun.nio.ch.IOUtil.write(IOUtil.java:65)
    at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:211)
    at org.apache.kafka.common.record.MemoryRecords.writeFullyTo(MemoryRecords.java:82)
    at org.apache.kafka.common.record.FileRecords.append(FileRecords.java:159)
    at kafka.log.LogSegment.append(LogSegment.scala:110)
    at kafka.log.Log.append(Log.scala:429)
    ... 21 more

最后来到:

[2019-11-22 17:28:00,395] WARN Found a corrupted index file due to requirement
failed: Corrupt index found, index file (/opt/kafka/kafka-logs/__consumer_offsets- 
9/00000000000000000000.index) has non-zero size but the last offset is 0 which is no
larger than the base offset 0.}. deleting /opt/kafka/kafka-logs/__consumer_offsets-9
/00000000000000000000.timeindex, /opt/kafka/kafka-logs/__consumer_offsets-9
/00000000000000000000.index and rebuilding index... (kafka.log.Log)
© www.soinside.com 2019 - 2024. All rights reserved.