在4.x版本中,UnpooledByteBufAllocator是默认的allocator,尽管其存在某些限制。现在PooledByteBufAllocator已经广泛使用一段时间,并且我们有了增强的缓冲区泄漏追踪机制,所以是时候让PooledByteBufAllocator成为默认了。
优化前:
在玩家达到1100左右时直接内存迅速升高,CPU占用也飙高,
在最高峰时,服务器堆内存总共 3993 M,占用堆内存 3476 M,直接内存总共 2048 M,占用直接内存 715.8125 M。
![](http://dl2.iteye.com/upload/attachment/0118/0676/14be52e3-a64e-3ac8-b8ac-bea566172b1d.jpg)
发现netty底层的对象占用了很多
![](http://dl2.iteye.com/upload/attachment/0118/0678/1da20820-8f0d-30e1-9ad8-b20c3785b2b2.jpg)
Class Name | Shallow Heap | Retained Heap |
class com.lingyu.game.service.stage.StageManager @ 0x738778950 » | 8 | 166,381,728 |
com.lingyu.game.service.equip.EquipDataTemplateManager @ 0x738051240 » | 64 | 61,389,640 |
io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x7a8a1b698 » | 40 | 56,363,384 |
com.lingyu.game.service.map.MapDataTemplateManager @ 0x738709b70 » | 64 | 48,234,856 |
com.lingyu.game.service.item.ItemRepository @ 0x7387965e0 » | 24 | 45,883,384 |
io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x7d0b4ad08 » | 40 | 45,730,344 |
io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x7dba870e8 » | 40 | 43,118,248 |
io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x76289b300 » | 40 | 41,260,728 |
io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x796226f90 » | 40 | 33,083,800 |
io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask @ 0x7ec9f19a0 » | 40 | 32,922,432 |
io.netty.channel.ChannelOutboundBuffer @ 0x754207b68 » | 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);//关键是这句
![](http://dl2.iteye.com/upload/attachment/0118/0694/38caddd8-12cb-3c9b-98ef-702d89b43a7e.jpg)
Class Name | Shallow Heap | Retained Heap |
class com.lingyu.game.service.stage.StageManager @ 0x738977238 » | 8 | 126,628,072 |
com.lingyu.game.service.equip.EquipDataTemplateManager @ 0x7380c53f8 » | 64 | 61,391,800 |
com.lingyu.game.service.map.MapDataTemplateManager @ 0x738ce20d8 » | 64 | 48,234,856 |
com.xianling.stage.configure.entity.map.PathInfoTemplate @ 0x7389e7c60 » | 40 | 8,975,440 |
sun.misc.Launcher$AppClassLoader @ 0x738024e80 » | 80 | 8,652,528 |
com.lmax.disruptor.RingBuffer @ 0x7382e4408 » | 32 | 7,340,056 |
com.lingyu.game.service.item.ItemDataTemplateManager @ 0x738bc4a30 » | 56 | 5,910,288 |
com.xianling.stage.configure.entity.map.PathInfoTemplate @ 0x73ac19aa8 » | 40 | 5,231,256 |
org.springframework.beans.factory.support.DefaultListableBeanFactory @ 0x7381979b8 » | 200 | 5,172,192 |
com.xianling.stage.configure.entity.map.PathInfoTemplate @ 0x73addc8b8 » | 40 | 4,572,560 |
Total: 10 entries |
总结:这次优化,内存省下1.7G,直接内存剩下300M,并且表现稳定,在线人数提升了300人(可能受带宽的限制,否则表现应该会更好),CPU从占用100%降到10%。