java.nio.DirectByteBuffer试图释放GC中的内存时JVM崩溃

java.nio.DirectByteBuffer试图释放GC中的内存时JVM崩溃,java,apache-spark,jvm,jvm-crash,Java,Apache Spark,Jvm,Jvm Crash,当我运行一个Apache Spark作业时,由于GC中的freejava.nio.DirectByteBuffer,executor JVM崩溃了,该作业只包含几行输入数据: Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) j sun.misc.Unsafe.freeMemory(J)V+0 j java.nio.DirectByteBuffer$Deallocator.run()V+17 J 1537 C1 ja

当我运行一个Apache Spark作业时,由于GC中的free
java.nio.DirectByteBuffer
,executor JVM崩溃了,该作业只包含几行输入数据:

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  sun.misc.Unsafe.freeMemory(J)V+0
j  java.nio.DirectByteBuffer$Deallocator.run()V+17
J 1537 C1 java.lang.ref.Reference.tryHandlePending(Z)Z (115 bytes) @ 0x00007f082d519f94 [0x00007f082d5199c0+0x5d4]
j  java.lang.ref.Reference$ReferenceHandler.run()V+1
v  ~StubRoutines::call_stub
没有记忆压力:

Heap:
par new generation   total 153344K, used 17415K [0x0000000738000000, 0x0000000742660000, 0x0000000742660000)
eden space 136320K,   1% used [0x0000000738000000, 0x00000007381955c8, 0x0000000740520000)
from space 17024K,   92% used [0x0000000740520000, 0x000000074148c778, 0x00000007415c0000)
to   space 17024K,    0% used [0x00000007415c0000, 0x00000007415c0000, 0x0000000742660000)
concurrent mark-sweep generation
total 2057856K, used 76674K [0x0000000742660000, 0x00000007c0000000, 0x00000007c0000000)
Metaspace       used 49890K, capacity 50454K, committed 50540K, reserved 1093632K
class space     used 6821K, capacity 6995K, committed 7056K, reserved 1048576K
完整的hs_错误文件:

在@the8472的建议下,我尝试了BTrace,发现
DirectByteBuffer
是从默认的Kyro序列化程序提交的。
因此,我添加了自己的Kyro序列化程序来处理avro数据,现在一切正常。

您试图使用sun.misc.Unsafe api来处理内存,这导致了分段错误,因此jvm崩溃

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j sun.杂项不安全。空闲内存(j)V+0 j java.nio.DirectByteBuffer$Deallocator.run()V+17 J 1537 C1 java.lang.ref.Reference.tryHandlePending(Z)Z(115字节)@0x00007f082d519f94[0x00007f082d5199c0+0x5d4] j java.lang.ref.Reference$ReferenceHandler.run()V+1
v~StubRoutines::call_stub`

我投票将这个问题作为离题题来结束,因为堆栈溢出不是一种调试服务。最像是JVM或Apache Spark中的一个bug。该错误表示它试图释放未分配的内容。或者是双重释放,这可能是由于使用内部API释放DBB和引用处理程序的内容之间的竞争造成的。很好的猜测,有没有办法查看这些
DirectByteBuffer
来自何处?配置记录探查器是,这是因为我试图在reducer端使用的数据结构是DirectByteBuffer。