Netty 如何实现对内存泄漏的监控

前言

在前面的四个章节中,我们介绍了 Netty 中用于内存管理的内存池算法。Netty4 开始默认都使用内存池用于分配内存空间。而承载池化内存空间的一般都是PooledByteBuf对象。使用池化ByteBuf可以提高性能,但是使用完毕需要注意是否需要进行手工释放。在需要手动释放的场合没有释放,就会因为申请的内存空间没有归还给内存池造成内存泄漏,最终应用程序OOM。

在复杂的应用程序中找到没有释放的PooledByteBuf是一个比较困难的事情,在没有工具辅助的情况下只能白盒检查所有的代码,效率无疑十分低下。

好在 Netty 也考虑到了这种情况,在 Netty 中设计了专门的泄漏检测接口用于对需要手动释放的资源对象进行监控。

JDK的弱引用和引用队列

在分析Netty的泄露监控功能之前,先来复习下其中会用到的JDK知识:引用。

在java中存在4中引用类型,分别是强引用,软引用,弱引用,虚引用。

强引用

强引用,是我们写程序最经常使用的方式。比如将一个值赋给一个变量,那这个对象就被该变量强引用了。除非将将null设置给该变量,否则因为该变量一直引用着对象,java的内存回收不会回收该对象。就算是内存不足异常发生也不会。

软引用

软引用所引用的对象会在java内存不足的时候,被gc回收。如果gc发生的时候,java的内存还充足则不会回收这个对象 使用的方式如下

SoftReference ref = new SoftReference(new Date());
Date tmp = ref.get(); //如果对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值