当前位置: 首页 > 知识库问答 >
问题:

Netty 4、Java 8 JVM致命错误(SIGSEGV)-PlatformDependent0.CopyMemory

房育
2023-03-14

在执行一些(轻度)负载测试时,我看到Netty 4.1.34和Oracle Java 1.8.0_202(都是最新的)的JVM致命错误崩溃。不幸的是,崩盘并不容易再现--它似乎只发生在1/10左右的时间。

这是一个HTTP代理(也有websocket支持),因此Netty的管道最初是用相关的HTTP编码器/解码器(HttpRequestDecoder,HttpReponseEncoder等)设置的,但管道将根据需要(例如看到“Upgrade:websocket”握手时)改变为支持websocket帧解码器/编码器。

最初,扩展/自定义websocket帧处理程序中的ByteBuf对象没有被释放,导致内存泄漏。但是在发布了这些之后,我现在看到了一个偶尔的Java VM崩溃:

---------------  T H R E A D  ---------------

Current thread (0x00007f164807d000):  JavaThread "nioEventLoopGroup-4-1" [_thread_in_Java, id=31262, stack(0x00007f163bc9d000,0x00007f163bd9e000)]

Stack: [0x00007f163bc9d000,0x00007f163bd9e000],  sp=0x00007f163bd9b780,  free space=1017k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0xad33a5]  VMError::report_and_die()+0x2e5
V  [libjvm.so+0x4e0444]  report_fatal(char const*, int, char const*)+0x54
V  [libjvm.so+0x9cc815]  SharedRuntime::continuation_for_implicit_exception(JavaThread*, unsigned char*, SharedRuntime::ImplicitExceptionKind)+0x345
V  [libjvm.so+0x918eac]  JVM_handle_linux_signal+0x6bc
V  [libjvm.so+0x90b858]  signalHandler(int, siginfo*, void*)+0x38
C  [libpthread.so.0+0xf6d0]
J 4010 C2 io.netty.util.internal.PlatformDependent0.copyMemory(Ljava/lang/Object;JLjava/lang/Object;JJ)V (35 bytes) @ 0x00007f167ef0b3d2 [0x00007f167ef0b360+0x72]
J 3776 C1 io.netty.buffer.UnsafeByteBufUtil.setBytes(Lio/netty/buffer/AbstractByteBuf;JILio/netty/buffer/ByteBuf;II)V (134 bytes) @ 0x00007f167f65d27c [0x00007f167f65c5a0+0xcdc]
J 3635 C1 io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(ILio/netty/buffer/ByteBuf;II)Lio/netty/buffer/ByteBuf; (16 bytes) @ 0x00007f167f5aeb4c [0x00007f167f5aea40+0x10c]
J 3634 C1 io.netty.buffer.AbstractByteBuf.writeBytes(Lio/netty/buffer/ByteBuf;II)Lio/netty/buffer/ByteBuf; (30 bytes) @ 0x00007f167f5af0dc [0x00007f167f5aef00+0x1dc]
J 4007 C2 io.netty.channel.DefaultChannelPipeline$HeadContext.write(Lio/netty/channel/ChannelHandlerContext;Ljava/lang/Object;Lio/netty/channel/ChannelPromise;)V (12 bytes) @ 0x00007f167f6ca460 [0x00007f167f6ca2a0+0x1c0]
J 3999 C2 io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run()V (35 bytes) @ 0x00007f167f28d54c [0x00007f167f28d300+0x24c]
J 5000 C2 io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(J)Z (96 bytes) @ 0x00007f167f645b84 [0x00007f167f645600+0x584]
J 4688% C1 io.netty.channel.nio.NioEventLoop.run()V (236 bytes) @ 0x00007f167f0327f4 [0x00007f167f0317c0+0x1034]
j  io.netty.util.concurrent.SingleThreadEventExecutor$5.run()V+44
j  io.netty.util.concurrent.FastThreadLocalRunnable.run()V+4
j  java.lang.Thread.run()V+11
v  ~StubRoutines::call_stub
V  [libjvm.so+0x68839b]  JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*)+0xddb
V  [libjvm.so+0x685c63]  JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*)+0x263
V  [libjvm.so+0x686227]  JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*)+0x47
V  [libjvm.so+0x6f239c]  thread_entry(JavaThread*, Thread*)+0x6c
V  [libjvm.so+0xa7b9eb]  JavaThread::thread_main_inner()+0xdb
V  [libjvm.so+0xa7bcf1]  JavaThread::run()+0x2d1
V  [libjvm.so+0x90d8c2]  java_start(Thread*)+0x102
C  [libpthread.so.0+0x7e25]

完整的hs_err_pid*.log文件位于pastebin。

这里有什么明显的东西吗?我以前运行的是一个过时版本的Netty,但是升级到最新版本并没有什么帮助(也就是说,我们仍然会出现崩溃)。

共有1个答案

阮炯
2023-03-14

您现在释放ByteBuffer对象可能过于随意。很可能是对PooledUnsafeDirectByteBuf.SetBytes的调用正在写入已释放的内存,从而导致崩溃。

这就是为什么Java有垃圾收集和直接字节缓冲区的使用必须小心处理的原因。

 类似资料:
  • 问题内容: 我从我不理解的Java编译器中收到一条错误消息。我已经在OSX 10.6、10.9和Ubuntu 14.04以及Java 6和7上测试了我的代码。当我使用Eclipse调试器或从解释器(使用-Xint选项)运行时,一切运行正常。否则,我将收到以下消息: Java 1.6: Java 1.7: Java 7的错误输出更多(已保存到文件中),但是不幸的是,我无法将其适合本文的字符数限制。有

  • 我对cocos Creator是个新手。我正在做一个游戏,当我按下home键回到应用程序时,应用程序崩溃了。调试时显示此错误: 如果有人能用简单的话解释我该怎么做。提前道谢。

  • 在开发过程中,一个错误一直随机出现。我忽略了它(我的错),因为应用程序需要发布,我在任何地方都没有找到解决方案,这让我发疯。 无论如何 Logcat打印此错误: A/libc:无效的地址或损坏的块0xb8f6eed8传递给dlfree的地址 A/libc:致命信号11 (SIGSEGV),代码1,tid 5429中的故障地址0x dead baad(FinalizerDaemon) 由于这没有告诉

  • 我正在尝试使用PDFDocument在Android上创建一个多页PDF文件。创建一个新页面(方法newPDFPage())后,下一行,例如

  • 我正在努力将mysql_results替换为mysqli。有人能帮忙吗。我所需要的只是在下面的代码中更正'mysqli_result($result,'0','theurl')'。当所有东西都使用mysql函数编写时,它就起作用了。但是在我将所有内容转换为mysqli之后,mysql_results转换似乎不起作用了。 当它工作时:echo(mysql_num_rows($query)!==0)?

  • 我得到以下错误: 警告:require_once(D:/xampp/htdocs/inc/head.php):无法打开流:第3行的D:\xampp\htdocs\ecommerce1\index.php中没有此类文件或目录 致命错误:require_once():无法打开required'D:/xampp/htdocs/inc/head。D:\xampp\htdocs\ecommerce1\ind