内存池
定义
命名空间:TouchSocket.Core
程序集:TouchSocket.Core.dll
一、说明
内存池是TouchSocket
系列的最重要的组成部分,在TouchSocket
产品中,BytePool
贯穿始终。所以熟练使用BytePool
,也是非常重要的。
二、功能
内存池(BytePool
)是解决创建、销毁大字节数组的最有力手段,其实质完全借鉴了微软的ArrayPool
。而且在此基础上做了更多的优化。
内存池的最小实现单体是内存块(ByteBlock)
和值内存块(ValueByteBlock)
。它们均实现了IBufferWriter<byte>
接口,可以更好的使用GetMemory
、GetSpan
与Advance
等功能。
三、创建与回收
3.1 内存池
BytePool
在默认情况提供了一个BytePool.Default
的默认静态实例。这是整个进程可以共享使用的。
当然您可以创建只属于自己的BytePool
。
BytePool bytePool = new BytePool(maxArrayLength: 1024 * 1024, maxArraysPerBucket: 50)
{
AutoZero = false,//在回收内存时,是否清空内存
MaxBucketsToTry = 5//最大梯度跨度
};
其中:
- maxArrayLength,是内存池的最大字节数组尺寸。
- maxArraysPerBucket是每个内存块桶的最大数组数量。
- AutoZero属性,在回收内存时,是否清空内存。
- MaxBucketsToTry是最大梯度跨度。例如:当梯度为16、32、64、128、512、1024时,MaxBucketsToTry为2,则当请求的长度是16时,且16的内存块均已派出,则会请求32,最大会请求到64,如果均已派出,则直接新建。
在内存池创建以后,可以直观的查看它的各个属性。包括:
Console.WriteLine($"内存池容量={bytePool.Capacity}");
Console.WriteLine($"内存池实际尺寸={bytePool.GetPoolSize()}");