Netty4底层用对象池和不用对象池实践优化
随着JVM虚拟机和JIT即时编译技术的发展,对象的分配和回收是个非常轻量级的工作。但是对于缓冲区Buffer,情况却稍有不同,特别是对于堆外直接内存的分配和回收,是一件耗时的操作。为了尽量重用缓冲区,Netty提供了基于内存池的缓冲区重用机制。性能测试表明,采用内存池的ByteBuf相比于朝生夕灭的ByteBuf,性能高23倍左右(性能数据与使用场景强相关)。
在4.x版本中,UnpooledByteBufAllocator是默认的allocator,尽管其存在某些限制。现在PooledByteBufAllocator已经广泛使用一段时间,并且我们有了增强的缓冲区泄漏追踪机制,所以是时候让PooledByteBufAllocator成为默认了。
优化前:
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 | |
|
0.00 0.71 8.87 15.05 71.87 175 2.638 0 0.000 2.638
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 |
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。