天天看點

Netty業務開發常見Bug解析不顯式初始化initialBytesToStripChannelHandler順序錯誤ChannelHandler 共享問題配置設定ByteBuf方式錯誤未考慮ByteBuf的釋放write(msg)就一定能寫資料?

不顯式初始化initialBytesToStrip

  • LengthFieldBasedFrameDecoder#initialBytesToStrip
Netty業務開發常見Bug解析不顯式初始化initialBytesToStripChannelHandler順序錯誤ChannelHandler 共享問題配置設定ByteBuf方式錯誤未考慮ByteBuf的釋放write(msg)就一定能寫資料?

ChannelHandler順序錯誤

  • 解碼編碼順序一定要注意
Netty業務開發常見Bug解析不顯式初始化initialBytesToStripChannelHandler順序錯誤ChannelHandler 共享問題配置設定ByteBuf方式錯誤未考慮ByteBuf的釋放write(msg)就一定能寫資料?

ChannelHandler 共享問題

  • 不該共享的共享了,并發時就有資料問題

    這個很容易了解,犯錯了也會很嚴重,必須避免。

  • 該共享的不共享,每個 pipeline 自己又單獨添加了,就等于重複存了該 handler 浪費記憶體
Netty業務開發常見Bug解析不顯式初始化initialBytesToStripChannelHandler順序錯誤ChannelHandler 共享問題配置設定ByteBuf方式錯誤未考慮ByteBuf的釋放write(msg)就一定能寫資料?

配置設定ByteBuf方式錯誤

配置設定器直接用

ByteBufAllocator.DEFAULT

等,而不是采用

ChannelHandlerContext.alloc()

Netty業務開發常見Bug解析不顯式初始化initialBytesToStripChannelHandler順序錯誤ChannelHandler 共享問題配置設定ByteBuf方式錯誤未考慮ByteBuf的釋放write(msg)就一定能寫資料?

未考慮ByteBuf的釋放

對于堆外記憶體或記憶體池,我們必須手動去釋放它,因為 GC 不負責處理。如果忘記釋放,就會完蛋。

是以一般繼承

Netty業務開發常見Bug解析不顯式初始化initialBytesToStripChannelHandler順序錯誤ChannelHandler 共享問題配置設定ByteBuf方式錯誤未考慮ByteBuf的釋放write(msg)就一定能寫資料?

完成記憶體釋放。

Netty業務開發常見Bug解析不顯式初始化initialBytesToStripChannelHandler順序錯誤ChannelHandler 共享問題配置設定ByteBuf方式錯誤未考慮ByteBuf的釋放write(msg)就一定能寫資料?

write(msg)就一定能寫資料?

Netty業務開發常見Bug解析不顯式初始化initialBytesToStripChannelHandler順序錯誤ChannelHandler 共享問題配置設定ByteBuf方式錯誤未考慮ByteBuf的釋放write(msg)就一定能寫資料?
  • ChannelHandlerContext.channel().writeAndFlush(msg)
Netty業務開發常見Bug解析不顯式初始化initialBytesToStripChannelHandler順序錯誤ChannelHandler 共享問題配置設定ByteBuf方式錯誤未考慮ByteBuf的釋放write(msg)就一定能寫資料?