内存使用技巧的目标

目标:

• 内存占用少(空间)

• 应用速度快(时间)

对 Java 而言:减少 Full GC 的 STW(Stop the world)时间

Netty 内存使用技巧 - 减少对像本身大小

例 1:用基本类型就不要用包装类:

例 2: 应该定义成类变量的不要定义为实例变量:

• 一个类 -> 一个类变量

• 一个实例 -> 一个实例变量

• 一个类 -> 多个实例

• 实例越多,浪费越多。

例 3: Netty 中结合前两者:

io.netty.channel.ChannelOutboundBuffer#incrementPendingOutboundBytes(long, boolean)

统计待写的请求的字节数

AtomicLong -> volatile long + static AtomicLongFieldUpdater

Netty 内存使用技巧 - 对分配内存进行预估

例 1:对于已经可以预知固定 size 的 HashMap避免扩容

可以提前计算好初始size或者直接使用

com.google.common.collect.Maps#newHashMapWithExpectedSize

例 2:Netty 根据接受到的数据动态调整(guess)下个要分配的 Buffer 的大小。可参考

io.netty.channel.AdaptiveRecvByteBufAllocator

Netty 内存使用技巧 - Zero-Copy

例 1:使用逻辑组合,代替实际复制。

例如 CompositeByteBuf:

io.netty.handler.codec.ByteToMessageDecoder#COMPOSITE_CUMULATOR

例 2:使用包装,代替实际复制。

byte[] bytes = data.getBytes();

ByteBuf byteBuf = Unpooled.wrappedBuffer(bytes);

例 3:调用 JDK 的 Zero-Copy 接口。

Netty 中也通过在 DefaultFileRegion 中包装了 NIO 的 FileChannel.transferTo() 方法实

现了零拷贝:io.netty.channel.DefaultFileRegion#transferTo

Netty 内存使用技巧 - 堆外内存

•JVM 内部 -> 堆(heap) + 非堆(non heap)

• JVM 外部 -> 堆外(off heap)

使用堆外内存 :

• 优点:

• 更广阔的“空间 ”-> 破除堆空间限制,减轻 GC 压力

• 减少“冗余”细节(假设烧烤过程为了气氛在室外进行:烤好直接上桌:vs 烤好还

要进店内)-> 避免复制

• 缺点:

• 创建速度稍慢

• 堆外内存受操作系统管理

Netty 内存使用技巧 - 内存池

为什么引入对象池:

• 创建对象开销大

• 对象高频率创建且可复用

• 支持并发又能保护系统

• 维护、共享有限的资源

如何实现对象池?

• 开源实现:Apache Commons Pool

• Netty 轻量级对象池实现 io.netty.util.Recycler

怎么从堆外内存切换堆内使用?

• 方法 1:参数设置

io.netty.noPreferDirect = true;

• 方法 2:传入构造参数false

ServerBootstrap serverBootStrap = new ServerBootstrap();

UnpooledByteBufAllocator unpooledByteBufAllocator = new UnpooledByteBufAllocator( false );

serverBootStrap.childOption(ChannelOption.ALLOCATOR, unpooledByteBufAllocator)

堆外内存的分配?

ByteBuffer.allocateDirect(initialCapacity)

用netty实现zcool_Netty 如何玩转内存使用相关推荐

  1. 华为荣耀畅玩7c计算机在那,华为荣耀畅玩7C内存多大

    华为荣耀畅玩7C内存多大这是很多朋友咨询的问题,华为荣耀畅玩7C凭借高颜值,双摄,人脸识别受到广泛关注,但是也有很多朋友更关心内存多大的问题,下面就来详细介绍一下华为荣耀畅玩7C内存多大. 华为荣耀畅 ...

  2. 抓到Netty一个隐藏很深的内存泄露Bug | 详解Recycler对象池的精妙设计与实现

    本系列Netty源码解析文章基于 4.1.56.Final版本 最近在 Review Netty 代码的时候,不小心用我的肉眼抓到了一个隐藏很深很深的内存泄露 Bug. 于是笔者将这个故事-哦不 -事 ...

  3. 打游戏计算机内存不足,玩游戏内存不足? 教你轻松几步升级电脑内存

    原标题:玩游戏内存不足? 教你轻松几步升级电脑内存 明明才忍痛更新了电脑显卡,为啥游戏体验提升没有任何感觉?其实,是内存在作怪! 对于游戏玩家来讲,在极致特效下畅玩自己心水的游戏,应当是件特别幸福的事 ...

  4. 用netty实现zcool_Netty 系列一(核心组件和实例).

    一.概念 早期的 Java API 只支持由本地系统套接字库提供所谓的由于是阻塞 I/O ,要管理多个并发客户端,需要为每个新的客户端Socket 创建一个 Thread .这将导致一系列的问题,第一 ...

  5. Netty防止内存泄漏措施

    谨以此文献给李林锋即将新生的爱女. 1.  背景 1.1 直播平台内存泄漏问题 某直播平台,一些网红的直播间在业务高峰期,会有 10W+ 的粉丝接入,如果瞬间发生大量客户端连接掉线.或者一些客户端网络 ...

  6. C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。

    前言 作为.net程序员,使用过指针,写过不安全代码吗? 为什么要使用指针,什么时候需要使用它,以及如何安全.高效地使用它? 如果能很好地回答这几个问题,那么就能很好地理解今天了主题了.C#构建了一个 ...

  7. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span

    前言 作为.net程序员,使用过指针,写过不安全代码吗? 为什么要使用指针,什么时候需要使用它? 如果能很好地回答这两个问题,那么就能很好地理解今天了主题了.C#构建了一个托管世界,在这个世界里,只要 ...

  8. Netty技术细节源码分析-ByteBuf的内存泄漏原因与检测

    本文的github地址:点此 该文所涉及的netty源码版本为4.1.6. Netty中的ByteBuf为什么会发生内存泄漏 在Netty中,ByetBuf并不是只采用可达性分析来对ByteBuf底层 ...

  9. Netty内存池 (5w长文+史上最全)

    文章很长,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 ...

最新文章

  1. Proximal Algorithms 4 Algorithms
  2. php 声明字符串的三种方式
  3. 黑马程序员pink老师前端入门教程,零基础必看的JavaScript基础语法视频教程(DOM)
  4. Java命令行界面(第23部分):Rop
  5. 报表打印问题整体解决方案
  6. HDVPSS模块介绍及使用
  7. 联想拯救者Y90电竞旗舰正式入网:搭载三星E4 OLED屏 支持144Hz刷新率
  8. 小程序UI组件库合集——Vant、iView、ColorUI
  9. bzoj 4568 [Scoi2016]幸运数字
  10. Minimum Flips to Make a OR b Equal to c(C++ 或运算的最小翻转次数)
  11. dmitry -iwnse yuming
  12. APP上架各大应用市场对比
  13. android 环信集成,Android 环信集成使用总结
  14. [透视变换]象棋棋盘矫正Python&OpenCV
  15. Discuz被挂马的处理经验,Dz为什么会被挂马
  16. 小米air2se耳机只有一边有声音怎么办_盘点2020半入耳蓝牙耳机排名
  17. FutureTask源码学习
  18. 我的知识和我的动力,来自哪里?
  19. 2、正向代理和反向代理(正向代理(客户端),反向代理(服务器))
  20. [UE4]不错的音效插件WWISE

热门文章

  1. etcd 笔记(03)— etcd 客户端使用(键值的增、删、改、查)、watch监测键、lease使用(创建租约、撤销租约、刷新租期、查询租期)
  2. Python 标准库之 Queue
  3. 2017 年总结及 2018 年计划
  4. 2017 年已读书单总结
  5. 如何优雅的在python中暂停死循环?
  6. LeetCode简单题之使每位学生都有座位的最少移动次数
  7. Apache POI:解决数据库和Excel之间相互转换的烦恼~
  8. deeplearning量化
  9. HDR sensor 原理介绍
  10. Cocos 全局变量的使用