我想知道那里的某些JVM专家能否简要解释以下错误。从技术上讲,这实际上意味着什么,并且可能导致该错误的事件顺序是什么?
java.lang.InternalError: a fault occurred in a recent unsafe memory access operation in compiled Java code
此错误意味着sun.misc.Unsafe.getX()
或putX()
内存访问导致SIGBUS
错误,该错误随后被JVM捕获并转换为异步SIGBUS
。
更多细节:
InternalError
是JDK私有API,它允许直接从Java访问本机内存。该API是Direct ByteBuffers的基础,尤其是sun.misc.Unsafe
。在某些情况下,访问文件的内存映射区域可能会导致OS级异常,即MappedByteBuffers。典型示例为:
SIGBUS
文件系统上的文件的页面会导致内存不足(默认情况下tmpfs
空间受限于总RAM的50%)。HotSpot JVM无法预先有效地检测到这些问题。它将tmpfs
调用编译为简单的内存访问指令。额外检查以查看内存区域是否有效将太昂贵。
Unsafe.getX / putX
信号。如果在SIGBUG
调用中发现错误发生,则将Unsafe
发布到当前线程并继续执行。InternalError
更合适,但JVM不能抛出它或任何其他异常,因为IOException
公共协定不允许其ByteBuffer
方法抛出任何异常。get/put
内存访问失败,则JVM不会立即引发异常(同样,对于这种热字节缓冲区API而言,它太昂贵了)。而是将asynchronous Unsafe
发布到当前线程。这意味着错误实际上是在最接近的本机方法或对VM运行时的最接近调用处引发的。因此,错误消息中的单词“ recent”。请参阅InternalError
描述有关JDK错误的解决方案。
此错误可能是由索引损坏引起的,而索引又由于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)