我应该重用 DatagramPacket 吗? [英] Should I reuse DatagramPacket?

查看:30
本文介绍了我应该重用 DatagramPacket 吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am building a UDP-based application that receives and sends multiple packets.

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

I could build a new DatagramPacket for each send, or I recycle one instance for the life of my application.

  • 重用 DatagramPacket 有什么好处吗?(例如内存分配)
  • 是否存在任何潜在问题?(例如线程安全)
  • Are there any advantages to reusing a DatagramPacket? (e.g. memory-allocation)
  • Are there any potential problems? (e.g. thread-safety)

推荐答案

看起来你不能.我只是尝试发送相同的 DatagramPacket 两次,我得到以下行为:

It looks like you can't. I just tried sending the same DatagramPacket twice and I get the following behavior:

  • 数据包只发送一次
  • Netty 记录以下警告

因此,您可以重用传递给 DatagramPacket 构造函数的参数,主要是缓冲区,而不是重用 DatagramPacket.

So, instead of reusing the DatagramPacket, you can reuse the arguments you pass to the DatagramPacket constructor, mainly the buffer.

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.UnsafeByteBufUtil.setBytes(UnsafeByteBufUtil.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$AbstractUnsafe.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.runAllTask​​s(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)在 java.lang.Thread.run(Thread.java:748)

2018-10-18 09:29:11.103 WARN 5468 --- [nioEventLoopGroup-2-1] i.n.c.AbstractChannelHandlerContext : Failed to mark a promise as failure because it has failed already: DefaultChannelPromise@748a9b0e(failure: java.lang.IndexOutOfBoundsException: srcIndex: 0), unnotified cause: java.lang.IndexOutOfBoundsException: srcIndex: 0 at io.netty.buffer.UnsafeByteBufUtil.setBytes(UnsafeByteBufUtil.java:519) at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:260) at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1080) at io.netty.channel.nio.AbstractNioChannel.newDirectBuffer(AbstractNioChannel.java:481) at io.netty.channel.socket.nio.NioDatagramChannel.filterOutboundMessage(NioDatagramChannel.java:308) at io.netty.channel.AbstractChannel$AbstractUnsafe.write(AbstractChannel.java:877) at io.netty.channel.DefaultChannelPipeline$HeadContext.write(DefaultChannelPipeline.java:1391) at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:738) at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:730) at io.netty.channel.AbstractChannelHandlerContext.access$1900(AbstractChannelHandlerContext.java:38) at io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.write(AbstractChannelHandlerContext.java:1081) at io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:1128) at io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:1070) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:446) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748)

io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 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$AbstractUnsafe.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.runAllTask​​s(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.run(Thread.java:748) [na:1.8.0_181]

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

这篇关于我应该重用 DatagramPacket 吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆