Netty4底层用对象池和不用对象池实践优化

标签: netty4 对象 对象 | 发表时间:2014-09-24 02:20 | 作者:jiangguilong2000
出处:http://blog.csdn.net
随着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 Name Shallow Heap Retained Heap
8 166,381,728
64 61,389,640
40 56,363,384
64 48,234,856
24 45,883,384
40 45,730,344
40 43,118,248
40 41,260,728
40 33,083,800
40 32,922,432
72 25,823,800
  • 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

主要是加了以下两句:
bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);//关键是这句


Class Name Shallow Heap Retained Heap
8 126,628,072
64 61,391,800
64 48,234,856
40 8,975,440
80 8,652,528
32 7,340,056
56 5,910,288
40 5,231,256
200 5,172,192
40 4,572,560
Total: 10 entries    
总结:这次优化,内存省下1.7G,直接内存剩下300M,并且表现稳定,在线人数提升了300人(可能受带宽的限制,否则表现应该会更好),CPU从占用100%降到10%。
作者:jiangguilong2000 发表于2014-9-23 18:20:19 原文链接
阅读:112 评论:1 查看评论

相关 [netty4 对象 对象] 推荐:

Netty4底层用对象池和不用对象池实践优化

- - CSDN博客研发管理推荐文章
随着JVM虚拟机和JIT即时编译技术的发展,对象的分配和回收是个非常轻量级的工作. 但是对于缓冲区Buffer,情况却稍有不同,特别是对于堆外直接内存的分配和回收,是一件耗时的操作. 为了尽量重用缓冲区,Netty提供了基于内存池的缓冲区重用机制. 性能测试表明,采用内存池的ByteBuf相比于朝生夕灭的ByteBuf,性能高23倍左右(性能数据与使用场景强相关).

javascript对象转json

- - JavaScript - Web前端 - ITeye博客
把javascript对象转成json. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

对象的消息模型

- loudly - 酷壳 - CoolShell.cn
[ ———— 感谢 Todd 同学 投递本文,原文链接 ———— ]. 话题从下面这段C++程序说起,你认为它可以顺利执行吗. 试试的确可以顺利运行输出hello world,奇怪吗. 其实并不奇怪,根据C++对象模型,类的非虚方法并不会存在于对象内存布局中,实际上编译器是把Hello方法转化成了类似这样的全局函数:.

jQuery的deferred对象详解

- 郑小东 - 阮一峰的网络日志
jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. 这个功能很重要,未来将成为jQuery的核心方法,它彻底改变了如何在jQuery中使用ajax. 为了实现它,jQuery的全部ajax代码都被改写了.

我连对象都没有。。。

- 老五 - Lzhi&#39;s Views
两个黄鹂鸣翠柳,我连对象都没有. 劝君更尽一杯酒,我连对象都没有. 莫愁前路无知己,我连对象都没有. 借问酒家何处有,我连对象都没有. 停车坐爱枫林晚,我连对象都没有. 一枝红杏出墙来,我连对象都没有. 壮士一去不复还,我连对象都没有. 烈火焚烧浑不怕,我连对象都没有. 雌雄双兔奔地走,我连对象都没有.

js对象深拷贝

- - ITeye博客
在做一个前台页面你的时候用到了一个自己写的List对象,在进行深拷贝的时候参考了网上的代码:. //对象扩展,tObj被扩展对象,sObj扩展对象. Object.extend(a,b);//a获得了b的所有属性. 我自己定义的list中没有定义constructor,所以执行sObj.constructor == Array会报错,我就修改为:.

Java的对象驻留

- - Java译站
Java会将源代码中的字符串常量存储到常量池中. 这不只是说它俩的值是一样的,而是说就是同一个字符串对象. 用Java的话来说就是a==b的结果是true. 然而这个只对字符串以及小的整型或者长整型有效. 其它的对象是不会被驻留的,也就是说如果你创建了两个对象而他们的值是相等的,但他们并不是同一个对象.

方案对象管理

- - CSDN博客数据库推荐文章
方案是数据库用户拥有的数据库对象的集合,方案对象是直接引用数据库的逻辑结构,对象包括表、索引、序列、视图、同义词等结构.  这一章大部分内容,我们在SQL的第九章创建和管理表及约束和第十章其它常用对象都已讲过,做一些补充. 堆表就是普通表,也叫堆组织表. 之所以这样叫,是因为他使用数据结构中堆的算法来组织表.

jquery获取对象大全

- - CSDN博客Web前端推荐文章
1、JQuery的核心的一些方法 . $("Element").length; ‘元素的个数,是个属性 . $("Element").size(); ’也是元素的个数,不过带括号是个方法 . $("Element").get(); ‘某个元素在页面中的集合,以数组的形式存储 . $("Element").get(index); ’功能和上面的相同,index表示第几个元素,数组的下标 .

Hibrernate 数据对象状态

- - ITeye博客
Hibernate 中数据对象状态概念介绍. 一、 数据对象在Session中的状态:. 1、理解Session的缓存:Session接口是Hibernate向应用程序. 提供操作数据库的主要接口,它提供了基本的增、删、改、查 方法;. Session具有一个缓存,Hibernate的缓存包括Session的缓存和SessionFactory的缓存;.