首页 > 其他分享 >Netty4底层用对象池和不用对象池实践优化

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

时间:2022-12-27 20:03:01浏览次数:41  
标签:netty service 对象 40 lingyu 内存 com Netty4 底层


随着JVM虚拟机和JIT即时编译技术的发展,对象的分配和回收是个非常轻量级的工作。但是对于缓冲区Buffer,情况却稍有不同,特别是对于堆外直接内存的分配和回收,是一件耗时的操作。为了尽量重用缓冲区,Netty提供了基于内存池的缓冲区重用机制。性能测试表明,采用内存池的ByteBuf相比于朝生夕灭的ByteBuf,性能高23倍左右(性能数据与使用场景强相关)。
在4.x版本中,UnpooledByteBufAllocator是默认的allocator,尽管其存在某些限制。现在PooledByteBufAllocator已经广泛使用一段时间,并且我们有了增强的缓冲区泄漏追踪机制,所以是时候让PooledByteBufAllocator成为默认了。
优化前:


在玩家达到1100左右时直接内存迅速升高,CPU占用也飙高,


在最高峰时,服务器堆内存总共 3993 M,占用堆内存 3476 M,直接内存总共 2048 M,占用直接内存 715.8125 M。



Netty4底层用对象池和不用对象池实践优化_堆内存



发现netty底层的对象占用了很多



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




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%。

标签:netty,service,对象,40,lingyu,内存,com,Netty4,底层
From: https://blog.51cto.com/u_4176761/5973464

相关文章

  • 高并发下Netty4底层bug导致直接内存溢出分析
    事故记录:10点游戏开服,迅速冲破2300+单区同时在线18点15分,运营反应玩家进不了,准备吃饭的人被抓回来排查故障发现,由于直接内存被占满,一直在FullGC,并且回收不掉,所以完全不......
  • 在Netty底层监控消息发送到Socket的时间
    1、调用writeAndFlush方法之后获取ChannelFuture;2、新增消息发送ChannelFutureListener,监听消息发送结果,如果消息写入网络Socket成功,则Netty会回调C......
  • Netty4 读写水位控制分析
    服务器上看看默认是多少ConfigurehighandlowwritewatermarksSetsane WRITE_BUFFER_HIGH_WATER_MARK andWRITE_BUFFER_LOW_WATER_MARKServerBootstrapbootstrap=......
  • 理解JavaScript中的“面向对象”
    理解JavaScript中的“面向对象”一引子面向对象,是程序开发者再熟悉不过的一个概念。一说到它,你首先会想到的是什么?类?继承?方法与属性?不同技术栈的开发者或许有不同的第一反......
  • C++概念之explicit,static成员,友元,内部类,匿名对象,拷贝对象的编译器优化(7千字长文详解!)
    c++详解之explicit,static成员,友元,内部类,匿名对象,拷贝对象的编译器优化关于对象的隐性类型转换类型转换我们知道当我们的将一个内置类型的变量强制赋值个另一个内置类型......
  • js判断空对象的方法
    一、将对象转为字符串比较这是最容易想到的方法,主要使用JSON.stringify()这个方法对对象进行强转:vara={};varb=newObject();console.log(JSON.stringify(a)=="{}")......
  • S3文件上传,默认公开(可通过对象url在公网访问)
    项目中需要上传图片至S3中,但是发现无论是通过AWS控制台上传的还是通过代码上传的,都无法通过url访问,都需要重新设置权限才可以,后来稍微研究了下,总结如下:1、设置存储桶的共......
  • 嵌入式系统底层软件的复杂性
    问题经常有人问,为什么嵌入式系统的底层软件,出问题后解决起来,耗时长。确实,底层软件处理的都是很常见很成熟的设备,比如Flash、以太网、SD卡。看起来应该不难。可是大多数......
  • 面向对象编程(OOP)
    面向对象编程(OOP)面向过程思想:(线性思维)步骤清晰简单,第一步做什么,第二步做什么...面对过程适合处理一些较为简单的问题面向对象思想:物理类聚,分类的思维模式,思考......
  • redis保存AtomicInteger对象踩坑及解决详解
    这篇文章主要介绍了redis保存AtomicInteger对象踩坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教redis保存AtomicInteger对象踩......