Netty4底层用对象池和不用对象池实践优化
来源:互联网 发布:zipfor mac中文破解版 编辑:程序博客网 时间:2024/06/05 06:00
有用的地址: https://stackoverflow.com/questions
随着JVM虚拟机和JIT即时编译技术的发展,对象的分配和回收是个非常轻量级的工作。但是对于缓冲区Buffer,情况却稍有不同,特别是对于堆外直接内存的分配和回收,是一件耗时的操作。为了尽量重用缓冲区,Netty提供了基于内存池的缓冲区重用机制。性能测试表明,采用内存池的ByteBuf相比于朝生夕灭的ByteBuf,性能高23倍左右(性能数据与使用场景强相关)。
在4.x版本中,UnpooledByteBufAllocator是默认的allocator,尽管其存在某些限制。现在PooledByteBufAllocator已经广泛使用一段时间,并且我们有了增强的缓冲区泄漏追踪机制,所以是时候让PooledByteBufAllocator成为默认了。
优化前:
在玩家达到1100左右时直接内存迅速升高,CPU占用也飙高,
在最高峰时,服务器堆内存总共 3993 M,占用堆内存 3476 M,直接内存总共 2048 M,占用直接内存 715.8125 M。
发现netty底层的对象占用了很多
- class com.lingyu.game.service.stage.StageManager @ 0x738778950 »
- com.lingyu.game.service.equip.EquipDataTemplateManager @ 0x738051240 »
- io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x7a8a1b698 »
- com.lingyu.game.service.map.MapDataTemplateManager @ 0x738709b70 »
- com.lingyu.game.service.item.ItemRepository @ 0x7387965e0 »
- io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x7d0b4ad08 »
- io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x7dba870e8 »
- io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x76289b300 »
- io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x796226f90 »
- io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x7ec9f19a0 »
- io.netty.channel.ChannelOutboundBuffer @ 0x754207b68 »
- Total: 11 entries
优化,猜测是因为直接内存不够用,在反复申请空间,导致CPU占用,并且直接内存一直回收不掉!使用对象池后,1380人,CPU占用大概为100/1200,表现很稳定,FULLGC 次数为0
服务器堆内存总共 3993 M,占用堆内存 2150 M,直接内存总共 2048 M,占用直接内存 400.00098 M
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.71 8.87 15.05 71.87 175 2.638 0 0.000 2.638
0.00 0.71 8.87 15.05 71.87 175 2.638 0 0.000 2.638
主要是加了以下两句:
bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);//关键是这句
bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);//关键是这句
- class com.lingyu.game.service.stage.StageManager @ 0x738977238 »
- com.lingyu.game.service.equip.EquipDataTemplateManager @ 0x7380c53f8 »
- com.lingyu.game.service.map.MapDataTemplateManager @ 0x738ce20d8 »
- com.xianling.stage.configure.entity.map.PathInfoTemplate @ 0x7389e7c60 »
- sun.misc.Launcher$AppClassLoader @ 0x738024e80 »
- com.lmax.disruptor.RingBuffer @ 0x7382e4408 »
- com.lingyu.game.service.item.ItemDataTemplateManager @ 0x738bc4a30 »
- com.xianling.stage.configure.entity.map.PathInfoTemplate @ 0x73ac19aa8 »
- org.springframework.beans.factory.support.DefaultListableBeanFactory @ 0x7381979b8 »
- com.xianling.stage.configure.entity.map.PathInfoTemplate @ 0x73addc8b8 »
总结:这次优化,内存省下1.7G,直接内存剩下300M,并且表现稳定,在线人数提升了300人(可能受带宽的限制,否则表现应该会更好),CPU从占用100%降到10%。
阅读全文
0 0
- Netty4底层用对象池和不用对象池实践优化
- Netty4底层用对象池和不用对象池实践优化
- [Unity优化]对象池
- 创建类对象时:用new和不用new区别!
- C++用new和不用new创建类对象区别
- C++用new和不用new创建类对象区别
- C++用new和不用new创建类对象区别
- C++用new和不用new创建类对象区别
- C++用new和不用new创建类对象区别 .
- C++用new和不用new创建类对象区别
- C++用new和不用new创建类对象区别
- C++用new和不用new创建类对象区别
- C++用new和不用new创建类对象区别
- C++用new和不用new创建类对象区别
- C++用new和不用new创建类对象区别
- C++用new和不用new创建类对象区别
- C++用new和不用new创建类对象区别
- C++用new和不用new创建类对象区别
- 对象级别锁 vs 类级别锁
- spring源码分析 加载bean过程
- 支付宝个人申请网址和下载地址
- web菜鸟学习心得--css导入方式
- 练习题8
- Netty4底层用对象池和不用对象池实践优化
- 转载别人的文章
- 在AndroidStudio中使用ARCore
- 单链表的基本操作(适合数据结构初学者)
- OpenCV常用的头文件
- http填坑2&Ajax基础详解
- 单例模式
- Spark Streaming管理Kafka偏移量
- 滑动窗口的最大值——C++版