Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该重用DatagramPacket吗?_Java_Udp_Datagram_Object Pooling - Fatal编程技术网

Java 我应该重用DatagramPacket吗?

Java 我应该重用DatagramPacket吗?,java,udp,datagram,object-pooling,Java,Udp,Datagram,Object Pooling,我正在构建一个基于UDP的应用程序,用于接收和发送多个数据包 我可以为每次发送构建一个新的DatagramPacket,或者在应用程序的生命周期中回收一个实例 重用数据包有什么好处吗?(例如,内存分配) 有什么潜在的问题吗?(例如螺纹安全) 看起来你不能。我刚刚尝试发送了两次相同的DatagramPacket,得到了以下行为: 数据包只发送一次 Netty将警告记录在下面 因此,您可以重用传递给DatagramPacket构造函数的参数,主要是缓冲区,而不是重用DatagramPacket

我正在构建一个基于UDP的应用程序,用于接收和发送多个数据包

我可以为每次发送构建一个新的
DatagramPacket
,或者在应用程序的生命周期中回收一个实例

  • 重用
    数据包有什么好处吗?(例如,内存分配)
  • 有什么潜在的问题吗?(例如螺纹安全)

    • 看起来你不能。我刚刚尝试发送了两次相同的
      DatagramPacket
      ,得到了以下行为:

      • 数据包只发送一次
      • Netty将警告记录在下面
      因此,您可以重用传递给
      DatagramPacket
      构造函数的参数,主要是缓冲区,而不是重用
      DatagramPacket

      2018-10-18 09:29:11.103警告5468---[nioEventLoopGroup-2-1] i、 n.c.AbstractChannelHandlerContext:未能将承诺标记为 失败,因为它已失败: DefaultChannelPromise@748a9b0e(失败: java.lang.IndexOutOfBoundsException:srcIndex:0),未通知的原因: java.lang.IndexOutOfBoundsException:srcIndex:0 位于io.netty.buffer.unsafebytebuutil.setBytes(unsafebytebuutil.java:519) 在io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:260) 位于io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1080) 位于io.netty.channel.nio.AbstractNioChannel.newDirectBuffer(AbstractNioChannel.java:481) 位于io.netty.channel.socket.nio.NioDatagramChannel.filterOutboundMessage(NioDatagramChannel.java:308) 位于io.netty.channel.AbstractChannel$AbstractSafe.write(AbstractChannel.java:877) 位于io.netty.channel.DefaultChannelPipeline$HeadContext.write(DefaultChannelPipeline.java:1391) 位于io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:738) 位于io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:730) 在io.netty.channel.AbstractChannelHandlerContext.access$1900(AbstractChannelHandlerContext.java:38) 位于io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.write(AbstractChannelHandlerContext.java:1081) 位于io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:1128) 位于io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:1070) 位于io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) 位于io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) 位于io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:446) 位于io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) 在io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) 运行(Thread.java:748)

      io.netty.util.IllegalReferenceCountException:refCnt:0,减量:1 位于io.netty.buffer.AbstractReferenceCountedByteBuf.release0(AbstractReferenceCountedByteBuf.java:100) ~[netty-buffer-4.1.29.Final.jar!/:4.1.29.Final] 位于io.netty.buffer.AbstractReferenceCountedByteBuf.release(AbstractReferenceCountedByteBuf.java:84) ~[netty-buffer-4.1.29.Final.jar!/:4.1.29.Final] 在io.netty.util.ReferenceCountUtil.release(ReferenceCountUtil.java:88)上 ~[netty-common-4.1.29.Final.jar!/:4.1.29.Final] 在io.netty.channel.DefaultAddressedEnvelope.release(DefaultAddressedEnvelope.java:101)上 ~[netty-transport-4.1.29.Final.jar!/:4.1.29.Final] 在io.netty.util.ReferenceCountUtil.release(ReferenceCountUtil.java:88)上 ~[netty-common-4.1.29.Final.jar!/:4.1.29.Final] 位于io.netty.channel.AbstractChannel$AbstractSafe.write(AbstractChannel.java:884) ~[netty-transport-4.1.29.Final.jar!/:4.1.29.Final] 位于io.netty.channel.DefaultChannelPipeline$HeadContext.write(DefaultChannelPipeline.java:1391) ~[netty-transport-4.1.29.Final.jar!/:4.1.29.Final] 位于io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:738) [netty-transport-4.1.29.Final.jar!/:4.1.29.Final] 位于io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:730) [netty-transport-4.1.29.Final.jar!/:4.1.29.Final] 在io.netty.channel.AbstractChannelHandlerContext.access$1900(AbstractChannelHandlerContext.java:38) [netty-transport-4.1.29.Final.jar!/:4.1.29.Final] 位于io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.write(AbstractChannelHandlerContext.java:1081) [netty-transport-4.1.29.Final.jar!/:4.1.29.Final] 位于io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:1128) [netty-transport-4.1.29.Final.jar!/:4.1.29.Final] 位于io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:1070) [netty-transport-4.1.29.Final.jar!/:4.1.29.Final] 位于io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) [netty-common-4.1.29.Final.jar!/:4.1.29.Final] 位于io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) [netty-common-4.1.29.Final.jar!/:4.1.29.Final] 位于io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:446) [netty-transport-4.1.29.Final.jar!/:4.1.29.Final] 位于io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) [netty-common-4.1.29.Final.jar!/:4.1.29.Final] 在io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-common-4.1.29.Final.jar!/:4.1.29.Final] 在java.lang.Thread.r