用netty实现zcool_Netty 如何玩转内存使用
内存使用技巧的目标
目标:
• 内存占用少(空间)
• 应用速度快(时间)
对 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 如何玩转内存使用相关推荐
- 华为荣耀畅玩7c计算机在那,华为荣耀畅玩7C内存多大
华为荣耀畅玩7C内存多大这是很多朋友咨询的问题,华为荣耀畅玩7C凭借高颜值,双摄,人脸识别受到广泛关注,但是也有很多朋友更关心内存多大的问题,下面就来详细介绍一下华为荣耀畅玩7C内存多大. 华为荣耀畅 ...
- 抓到Netty一个隐藏很深的内存泄露Bug | 详解Recycler对象池的精妙设计与实现
本系列Netty源码解析文章基于 4.1.56.Final版本 最近在 Review Netty 代码的时候,不小心用我的肉眼抓到了一个隐藏很深很深的内存泄露 Bug. 于是笔者将这个故事-哦不 -事 ...
- 打游戏计算机内存不足,玩游戏内存不足? 教你轻松几步升级电脑内存
原标题:玩游戏内存不足? 教你轻松几步升级电脑内存 明明才忍痛更新了电脑显卡,为啥游戏体验提升没有任何感觉?其实,是内存在作怪! 对于游戏玩家来讲,在极致特效下畅玩自己心水的游戏,应当是件特别幸福的事 ...
- 用netty实现zcool_Netty 系列一(核心组件和实例).
一.概念 早期的 Java API 只支持由本地系统套接字库提供所谓的由于是阻塞 I/O ,要管理多个并发客户端,需要为每个新的客户端Socket 创建一个 Thread .这将导致一系列的问题,第一 ...
- Netty防止内存泄漏措施
谨以此文献给李林锋即将新生的爱女. 1. 背景 1.1 直播平台内存泄漏问题 某直播平台,一些网红的直播间在业务高峰期,会有 10W+ 的粉丝接入,如果瞬间发生大量客户端连接掉线.或者一些客户端网络 ...
- C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。
前言 作为.net程序员,使用过指针,写过不安全代码吗? 为什么要使用指针,什么时候需要使用它,以及如何安全.高效地使用它? 如果能很好地回答这几个问题,那么就能很好地理解今天了主题了.C#构建了一个 ...
- 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span
前言 作为.net程序员,使用过指针,写过不安全代码吗? 为什么要使用指针,什么时候需要使用它? 如果能很好地回答这两个问题,那么就能很好地理解今天了主题了.C#构建了一个托管世界,在这个世界里,只要 ...
- Netty技术细节源码分析-ByteBuf的内存泄漏原因与检测
本文的github地址:点此 该文所涉及的netty源码版本为4.1.6. Netty中的ByteBuf为什么会发生内存泄漏 在Netty中,ByetBuf并不是只采用可达性分析来对ByteBuf底层 ...
- Netty内存池 (5w长文+史上最全)
文章很长,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 ...
最新文章
- Proximal Algorithms 4 Algorithms
- php 声明字符串的三种方式
- 黑马程序员pink老师前端入门教程,零基础必看的JavaScript基础语法视频教程(DOM)
- Java命令行界面(第23部分):Rop
- 报表打印问题整体解决方案
- HDVPSS模块介绍及使用
- 联想拯救者Y90电竞旗舰正式入网:搭载三星E4 OLED屏 支持144Hz刷新率
- 小程序UI组件库合集——Vant、iView、ColorUI
- bzoj 4568 [Scoi2016]幸运数字
- Minimum Flips to Make a OR b Equal to c(C++ 或运算的最小翻转次数)
- dmitry -iwnse yuming
- APP上架各大应用市场对比
- android 环信集成,Android 环信集成使用总结
- [透视变换]象棋棋盘矫正Python&OpenCV
- Discuz被挂马的处理经验,Dz为什么会被挂马
- 小米air2se耳机只有一边有声音怎么办_盘点2020半入耳蓝牙耳机排名
- FutureTask源码学习
- 我的知识和我的动力,来自哪里?
- 2、正向代理和反向代理(正向代理(客户端),反向代理(服务器))
- [UE4]不错的音效插件WWISE