博客
关于我
使用Netty模拟发生OOM
阅读量:648 次
发布时间:2019-03-15

本文共 1677 字,大约阅读时间需要 5 分钟。

模拟Netty客户端和服务端之间的通信,OOM问题及解决思路

在实际开发中,有时会遇到客户端在进行持续化的网络IO操作时,内存不断膨胀,最终导致内存溢出(OOM)。在此文中,我们将重点分析基于Netty框架的客户端代码,探讨内存溢出的原因,并提出相应的解决方案。

乱世风流骨, 확인到底是谁在干什么?Hindi|ohenryrough

大约五分钟后发布

分析:

  • 环境描述基于技术分析:安装
  • 文档资料:大前端遇到的是个客户端和服务端都使用Netty进行通信的情况,涉及客户端发送大量数据接收。现任开发人员,可能会遇到内存溢出( OOM )问题。比较适合有Netty基础的开发人员。

    原文梳理:原文主要描述了一个Netty客户端不断发送数据给服务端,后来出现内存溢出问题。为了排查问题,作者使用MAT工具分析内存信息,发现存在大量存放在任务队列中的任务。

    问题字节数:1312图片数量:5

    分析结论:举例说明解决思路,问题产生的原因主要是多方面的。客户端的业务线程会一直循环发送数据到服务端,当这些发送操作无法及时被IO线程处理,任务队列就会积聚大量的任务,导致内存不足,引发溢出。这不仅依赖于编程方式,还和网络环境和配置参数有关。

    结论:正确配置虚拟机参数,合理利用Netty的高水位机制,避免让业务线程无休止地进行大规模写操作,可以有效防范内存溢出的发生。同时,及时处理服务端的数据接收,释放内存空间也至关重要。

    思考过程总结:中分析O OOM问题(客户端),重点步骤:

  • 启动本地服务端、远程客户端进行通信。
  • 使用MAT工具分析堆内存状态,观察到关键任务队列溢出。
  • 核查代码逻辑和Netty的内部机制。
  • 制定优化步骤:后台线程停止发送检测,避免过多任务积累。
  • 确保网络环境畅通,防止排队任务超出限制。
  • 技术分析:

    我会研究以下几个方面:

  • 业务线程大量发起的单次写操作如何影响性能。
  • Netty内置的缓冲机制和事件处理流程。
  • 任务队列容量限制是否有设置,默认是否足够应对需求。
  • 代理全网况下的程序内存分配表现。
  • 实际应用点是:简化业务处理逻辑,调整数据发送频率,使用_DECLARE(ANNOTATION)。配置:

    setMaxirectBufferCacheSizesetWriteChunkSize超时设置任务队列容量限制

    解决思路:基于Netty提供的高水位机制,在业务线程判断可用性,暂停发送,避免过度堆积。

    误解和培养:初期理解可能出错的地方:错误:认为高水位仅控制写能力而不影响行程。纠正:高水位只是一个阈值,不能阻止任务队列溢出,必须合理控制业务线程的操作频率。

    观察建议:

    • 监控任务队列的大小,设置上限。
    • 保持业务线程的空闲期,防止过度劳动。
    • 合理利用Netty的阻塞和非阻塞机制,适应性地配置线程池。

    改进措施:

  • 在业务线程中增加通道可写性检查,节制发送频率。
  • 设置Netty的任务队列容量上限,避免无限积聚。
  • 使用线程池替代业务线程,分摊任务量。
  • 定期回收长时间未完成的任务,释放内存资源。
  • 确认:

    • 減缓业务线操作:避免短时间内频繁触发IO。
    • 提高网络性能:优化数据包写入方式,减少资源消耗。
    • 内存管理:提前释放不再需要的资源,避免临时对象堆积。

    站点改进建议进行性能测试:

    精简数据传输量,优化数据处理流程,尽量减少对象创建。调整线程池配置,本地用NioEventLoopGroup,业务用HonyEventLoopGroup.查看可用性监控数据,及时发现资源 bottleneck。

    葡萄美酒建议:去年的Rubyconf China上有个分享:网络编程中常让人困扰的一个问题是“写缓冲区”总满了,怎么办?

    扩展思考:

    • 服务端也可能出现缓冲区溢出,需要同时监控。
    • 使用哪种编码解码缓冲器,是否存在资源泄漏。
    • Tomcat等容器的配置,是否提供额外的内存管理支持。

    总结:要避免Netty客户端OOP问题,需要综合考虑网络环境、协议obuf、任务队列容量和线程配置等多个维度。及时监控内存状态,正确应对问题,可以有效避免内存溢出的问题。

    转载地址:http://cwdmz.baihongyu.com/

    你可能感兴趣的文章
    在苹果Mac上如何更改AirDrop名称?
    查看>>
    1110 Complete Binary Tree (25 point(s))
    查看>>
    310【毕设课设】微机原理-基于8086CPU校园标语牌系统仿真设计
    查看>>
    541【毕设课设】基于单片机电阻电感电容RLC测量仪系统
    查看>>
    568【毕设课设】基于单片机多路温度采集显示报警控制系统设计
    查看>>
    基于8086交通灯系统仿真设计(微机原理设计资料)
    查看>>
    TCP/IP五层模型之数据链路层
    查看>>
    解读域名管理之:域名注册机构介绍
    查看>>
    找中位数
    查看>>
    这些运维发展方向及系统运维技能都不了解,怎么能吃透Linux??
    查看>>
    干货.一文快速告诉你API功能测试怎样做才能快捷高效!
    查看>>
    自动化测试——UI自动化测试的痛点
    查看>>
    如何将萌推商品主图、属性图、详情图批量保存到电脑的方法
    查看>>
    2021年N1叉车司机模拟考试及N1叉车司机考试软件
    查看>>
    【奇淫巧技】Java动态代理(JDK和cglib)
    查看>>
    2021-05-11 现代操作系统 《现代操作系统 第4版》第3章 内存管理——总结(分段,分页,段页)(转载)
    查看>>
    MP4修改元数据日志记录
    查看>>
    jdk7卸载后,Eclipse内的项目一片飘红
    查看>>
    WebView使用
    查看>>
    【Stimulsoft Reports.Net教程】使用DesignerFx
    查看>>