背景

近来在用 DotNetty 实现一个文件上传下载的同步服务。

其中:客户端下载服务端的文件,客户端多次请求,从服务端将文件分片下载下来,追加到本地磁盘。

—— 非常简单的代码,都写了几十次了,驾轻就熟。

问题来了

可是:在进行压力测试时,我这边下载一个 Win10 的 ISO 镜像,4个G。

我发现:客户端内存不停增长,直到内存溢出 —— 我擦。

VS2015内存诊断

内存诊断,我们发现 有很多 16M(16777228字节) 的 byte[] 占据着内存。

而我请求服务端的 文件分片 只有 64K

—— 于是我肯定:这些 16M 的 byte[] 肯定是 DotNetty 创建的。

调试代码

通过调试代码,确实发现了 这些 16M 字节所在的位置:

((DotNetty.Buffers.PooledByteBufferAllocator)
((DotNetty.Transport.Channels.AbstractChannelHandlerContext)context)
.Allocator)
.directArenas

简写就是:

context.Allocator.directArenas

知道了 内存泄漏 的数据 存在哪里,剩下的就是 删除这些数据。

因为 AllocatordirectArenas 都是不可访问的(私有类型)

我猜:按照微软框架的习惯,肯定有 属性 或 方法 能够设置 这个东西。

—— 是我想太多,我找了好久 都找不到 相关方法。

万能解法:反编译

直到数据在哪里,肯定有修正这些数据的方法。

反射是万能的 —— 但是我不想用。

于是,开始反编译:查看这个 directArenas 字段在哪里 赋值、哪里添加数据。

问题解决

再次运行程序,内存稳定在 30M —— 内存泄漏问题解决。

这次修改BUG,最废时间的 莫过于 DotNetty 毫无微软风格。

微软框架基本都有一个风格:底层一定提供了各种 函数、属性 —— 默认会给你一个 最稳定的默认值。

尼玛,这分明是 Java 的尿性:各种参数千奇百怪,不配参数还不能运行 —— 给我个默认参数 有那么难么~

『神坑』DotNetty 内存泄漏 解决办法的更多相关文章

  1. JAVA内存泄漏解决办法

    JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 ...

  2. java.lang.OutOfMemoryError: PermGen space (jvm内存泄漏解决办法)

    2.在myeclipse根目录 打开myeclipse.ini 3.在myeclipse中配置内存

  3. iOS常见内存泄漏解决

    iOS常见内存泄漏解决     1 OC和CF转化出现的内存警告 CFStringRef cfString = CFURLCreateStringByAddingPercentEscapes(kCFA ...

  4. linux中tomcat内存溢出解决办法

    用命令 tail -f /root/apache-tomcat-6.0.20/logs/catalina.out(需要找到tomcat路径) 查看日志,查看是否有错误 linux中tomcat内存溢出 ...

  5. word内存不足 解决办法

    word2013内存不足 解决办法具体操作如下: 尝试了很多方法和经验表示都没有效果,最后找到个有效果的分享给大家: 点击“文件”——选项——加载项“   点左下的”管理“-” 转到“ 把加载项前面的 ...

  6. java 大数据处理之内存溢出解决办法(一)

    http://my.oschina.net/songhongxu/blog/209951 一.内存溢出类型 1.java.lang.OutOfMemoryError: PermGen space JV ...

  7. python里的del变量无法立刻释放内存的解决办法

    最近在python开发的时候,用到了一些很占用内存的操作,导致后续程序执行很慢甚至无法执行.探索了一下,最终解决了这个问题. 截图解释: python变量占用了内存,仅仅通过del变量的方式,只是让这 ...

  8. Tomcat内存溢出解决办法

    使用Java程序从数据库中查询大量的数据时出现异常:java.lang.OutOfMemoryError: Java heap space在JVM中如果98%的时间是用于GC且可用的 Heap siz ...

  9. 一次python 内存泄漏解决过程

    最近工作中慢慢开始用python协程相关的东西,所以用到了一些相关模块,如aiohttp, aiomysql, aioredis等,用的过程中也碰到的很多问题,这里整理了一次内存泄漏的问题 通常我们写 ...

随机推荐

  1. Spring Cloud(十二):分布式链路跟踪 Sleuth 与 Zipkin【Finchley 版】

    Spring Cloud(十二):分布式链路跟踪 Sleuth 与 Zipkin[Finchley 版]  发表于 2018-04-24 |  随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请 ...

  2. cxf webservice生成客户端代码及调用服务端遇到的问题

    1.  从网上下载cxf开发的工具 apache-cxf-3.1.4.zip, 解压文件,找到apache-cxf-3.1.4\bin目录,里面包含一个wsdl2java文件 2. 设置环境变量 1. ...

  3. 设计一个卖不同种类车的4s店

    # 定义奔驰车类 class BenchiCar(object): # 定义车的方法 def move(self): print('---奔驰车在移动---') def stop(self): pri ...

  4. CSS命名规则常用的css命名规则

    CSS命名规则常用的css命名规则 头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wr ...

  5. CSS学习笔记二:css 画立体图形

    继上一次学了如何去运用css画平面图形,这一次学如何去画正方体,从2D向着3D学习,虽然有点满,但总是一个过程,一点一点积累,然后记录起来. Transfrom3D 在这一次中运用到了一下几种属性: ...

  6. 网络编程之套接字(tcp)

    经过几天高强度的学习,对套接字的编程有了初步的认识,今天对这几天所学的知识总结一下:首先简单阐述一下tcp通信: TCP提供的是可靠的,顺序的,以及不会重复的数据传输,处理流控制,由于TCP是可靠的, ...

  7. 2017年BackBox5和Ubuntu16.04.1国内更新源

    BackBox是基于Ubuntu的Linux发行版,因此,我们可以使用Ubuntu的更新源作为BackBox的更新源. 1.查看系统版本信息: 输入: uname -a 显示计算机及操作系统的有关信息 ...

  8. Intellij IDEA 安装lombok及使用详解

    项目中经常使用bean,entity等类,绝大部分数据类类中都需要get.set.toString.equals和hashCode方法,虽然eclipse和idea开发环境下都有自动生成的快捷方式,但 ...

  9. 如何最简便的利用Python实现数据可视化?当然离不开matplotlib!

    01|Figure和Subplot: matplotlib的图像全部在figure对象里面,就像是一片画布.figsize是figure的一个设置大小的属性.一个figure里面可以有无数个subpl ...

  10. copy.copy()与copy.deepcopy()的详解

    copy.copy() 元组和列表调用这个方法效果也不一样. 元组的效果: a = [1,2,3] b = [4,5,6] c = (a,b) e = copy.copy(c) 可以看到:e和c是指向 ...