Netty ByteBuf 释放注意事项
来源:互联网 发布:java基础自学需要多久 编辑:程序博客网 时间:2024/06/05 00:09
PooledByteBufAllocator 用来分配可回收的ByteBuf,可以把PooledByteBufAllocator看做一个池子,需要的时候从里面获取ByteBuf,用完了放回去,以此提高性能。当然与之对应的还有 UnpooledByteBufAllocator,顾名思义Unpooled就是不会放到池子里,所以根据该分配器分配的ByteBuf,不需要放回池子有JVM自己GC回收。
在netty中,根据ChannelHandlerContext 和 Channel获取的Allocator默认都是Pooled,所以需要再合适的时机对其进行释放,避免造成内存泄漏。
Netty默认会在ChannelPipline的最后添加一个tail handler帮你完成ByteBuf的release。
其释放的是channelRead传入的ByteBuf,如果在handlers传递过程中,传递了新值,老值需要你自己手动释放。
另外如果中途没有使用fireChannelRead传递下去也要自己释放。
在传递过程中自己通过Channel或ChannelHandlerContext创建的但是没有传递下去的ByteBuf也要手动释放。
为了帮助你诊断潜在的泄漏问题,netty提供了ResourceLeakDetector,该类会采样应用程序中%1的buffer分配,并进行跟踪。不用担心这个开销很小。
如果泄漏发生了会有如下log打印出来
SEVERE: LEAK: ByteBuf.release() was not called before it's garbage-collected. Enable advanced leak reporting to find out where the leak occurred. To enable advanced leak reporting, specify the JVM option '-Dio.netty.leakDetection.level=advanced' or call ResourceLeakDetector.setLevel() See http://netty.io/wiki/reference-counted-objects.html for more information.Netty目前定义了四中检测级别,
DISABLE, SIMPLE(默认),ADVANCED, PARANOID
可以通过java -Dio.netty.leakDetectionLevel=ADVANCED指定
指定后会打印出如下信息
SEVERE: LEAK: ByteBuf.release() was not called before it's garbage-collected. See http://netty.io/wiki/reference-counted-objects.html for more information.Recent access records: 0Created at:io.netty.util.ResourceLeakDetector.track(ResourceLeakDetector.java:237)io.netty.buffer.PooledByteBufAllocator.newDirectBuffer(PooledByteBufAllocator.java:331)io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:181)io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:167)io.netty.buffer.AbstractByteBufAllocator.buffer(AbstractByteBufAllocator.java:101)com.bin.netty.channelhandler.EchoChannelHandler.channelRead(EchoChannelHandler.java:24)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1342)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:934)io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:134)io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)java.lang.Thread.run(Thread.java:745)
有些人可能运行时无法打印出上面所提到的那些信息,首先要满足两个条件
1,要有足够的ByteBuf分配才可以,可以自己在代码直接分配200个,
2,要在GC之后,然后在分配,此时就会打印出对应的detect信息。
- Netty ByteBuf 释放注意事项
- Netty之ByteBuf的创建和释放
- Netty ByteBuf
- Netty ByteBuf
- netty 学习之bytebuf
- Netty - Bytebuf(1)
- Netty - ByteBuf (2)
- Netty - ByteBuf (3)
- Netty之ByteBuf
- netty的ByteBuf
- Netty bytebuf 内存泄漏
- Netty的ByteBuf介绍
- Netty的ByteBuf介绍
- netty, ByteBuf 转 String
- Netty中的ByteBuf
- Netty ByteBuf 零拷贝
- Netty bytebuf 源码解析
- Netty ByteBuf分析
- ifconfig
- 使用POI导入Excel文件信息
- 织梦DEDE网站程序动态化+静态化+伪静态设置(图文)教程
- html接入海康视频数据
- Eureka+ribbon 实现服务注册与发现和负载均衡
- Netty ByteBuf 释放注意事项
- 网站开发(九)后台栏目的删除操作
- 微信中Google坐标转换为百度地图坐标
- Android 接入银联支付
- 生成随机数
- 导入paramiko库时报 UnicodeDecodeError 错误的解决方案
- dll包含的函数
- not null
- http://blog.csdn.net/liuxingyu_21/article/details/18412123