引言
Netty 4.0 之后,netty中某些对象的生命周期由它们的援用计数治理,如ByteBuf是利用援用计数来进步调配和开释性能的最驰名类型.
援用计数
—1—援用计数对象的初始援用计数为 1。
—2—当开释援用计数对象时,它的援用计数减 1。
个别法令是,最初拜访援用计数对象的一方也负责销毁该援用计数对象。具体来说:如果 [发送] 组件应该将援用计数对象传递给另一个 [接管] 组件,发送组件通常不须要销毁它,而是将决定推延到接管组件。如果一个组件应用了一个援用计数的对象并且晓得没有其他人会再拜访它(即,不传递对另一个组件的援用),则该组件应该销毁它。
—3—如果援用计数达到 0,则援用计数对象被开释或返回到它来自的对象池,尝试拜访援用计数为 0 的援用计数对象将触发IllegalReferenceCountException。
—4—当对象还没有被销毁之前,援用计数也能够通过retain()操作减少。
Derived buffers
—1—ByteBuf.duplicate()、ByteBuf.slice()及ByteBuf.order(ByteOrder)创立一个共享父缓冲区内存区域的派生缓冲区。派生缓冲区没有本人的援用计数,但共享父缓冲区的援用计数。
—2—相同,ByteBuf.copy()和ByteBuf.readBytes(int)不是派生缓冲区。返回ByteBuf的已调配,须要开释。须要留神的是,父缓冲区及其派生缓冲区共享雷同的援用计数,并且创立派生缓冲区时援用计数不会减少。因而,如果您要将派生缓冲区传递给应用程序的其余组件,则必须先调用retain()它。
ByteBufHolder interface
可应用ByteBufHolder 持有 ByteBuf,例如DatagramPacket、HttpContent和WebSocketframe .这些类都继承自ByteBufHolder。和Derived buffers一样,ByteBufHolder持有者共享其蕴含的缓冲区的援用计数。
ChannelHandler 的援用计数
Inbound messages(入站音讯)
—1—当事件循环将数据读入ByteBuf并触发channelRead()事件时,ChannelHandler相应管道中的 负责开释缓冲区。因而,应用接管到的数据的处理程序应该release()在其channelRead()处理程序办法中调用数据。
—2—如果处理程序将缓冲区(或任何援用计数对象)传递给下一个处理程序,则无需开释它。
—3—能够间接应用ReferenceCountUtil.release(),或思考扩大SimpleChannelHandlerwhich 对所有音讯调用ReferenceCountUtil.release(msg)。
Outbound messages(出站音讯)
与入站音讯不同,出站音讯是由本人的应用程序创立的,Netty 负责在将它们写入网络后开释这些音讯。
特地留神encoders之后正确开释。