内存池
定义
命名空间:TouchSocket.Core
程序集:TouchSocket.Core.dll
一、说明
内存池是TouchSocket
系列的最重要的组成部分,在TouchSocket
产品中,ArrayPool
贯穿始终。所以熟练使用ArrayPool
,也是非常重要的。
二、功能
内存池(ArrayPool<T>
)是微软的ArrayPool<T>
。但是在用法上做了一些的优化。
内存池的最小实现单体是内存块(ByteBlock)
和值内存块(ValueByteBlock)
。它们均实现了IBufferWriter<byte>
接口,可以更好的使用GetMemory
、GetSpan
与Advance
等功能。
三、创建与回收
3.1 内存池
ArrayPool<T>
在默认情况提供了一个ArrayPool<T>.Shared
的默认静态实例。这是整个进程可以共享使用的。
当然您可以创建只属于自己的ArrayPool<T>
。
ArrayPool<byte> bytePool = new ArrayPool<byte>(maxArrayLength: 1024 * 1024, maxArraysPerBucket: 50);
其中:
- maxArrayLength,是内存池的最大字节数组尺寸。
- maxArraysPerBucket是每个内存块桶的最大数组数量。
3.2 创建、释放内存块
内存块就是可以使用的字节数组。框架提供了ByteBlock
和ValueByteBlock
两种内存块。ValueByteBlock
是值类型的,其余特点完全一致。
【创建ByteBlock】
var byteBlock = new ByteBlock(1024 * 64);
byteBlock.Dispose();
【创建ValueByteBlock】
var byteBlock = new ValueByteBlock(1024 * 64);
byteBlock.Dispose();
以上的创建方式,都是从默认内存池创建。如果想要自定义内存池,可以在new的时候指定内存池。
var byteBlock = new ByteBlock(1024 * 64,ArrayPool.Default);
byteBlock.Dispose();
释放过程也完全可以使用using
。
using (var byteBlock = new ByteBlock(1024 * 64))
{
//使用ByteBlock
}
提示
byteSize
用于申请的最小字节尺寸。例如:当申请100长度时,可能会得到100,1000,甚至更大尺寸的内存,但绝不会小于100
注意
创建的ByteBlock
(ValueByteBlock
)必须显示释放(Dispose
),可用using
,如果不释放,虽然不会内存泄露,但是会影响性能。