1:背景1.讲故事最近在分析一个dump的过程中,发现在gen2和LOH上有很多大尺寸的free。仔细一看,这些free大部分都是模板引擎生成的html。片段的byte[]数组。当然,我不是来分析dump的,而是想谈谈在托管堆有很多byte[]数组,长度很大的情况下,如何让内存利用更高效。更少的压力。不知道大家有没有发现,.netcore中加入了很多池化对象,比如:ArrayPool、ObjectPool等,在某些场景下确实非常实用,所以有必要对它有更深入的了解他们。二:ArrayPool源码分析1.一图胜千言我花了将近一个小时的时间看完了源码,画了一张ArrayPool的池化图。有了这张图,再说几个概念,再配上相应的源码。我觉得应该差不多。2.pooling的架构分类是什么?ArrayPool由若干个Bucket组成,Bucket由若干个buffer[]数组组成。有了这个概念之后,我们来配置代码。publicabstractclassArrayPool{publicstaticArrayPoolCreate(){returnnewConfigurableArrayPool();}}internalsealedclassConfigurableArrayPool:ArrayPool{privatesealedclassBucket{internalreadonlyint_bufferLength;privatereadonlyT[]read[]_private_buffersindex[on}private];//bucketarray}3.为什么每个bucket里面有50个buffer[]这个问题很好回答。maxArraysPerBucket=50设置是在初始化期间设置的。当然,您也可以自定义它。具体可参考以下代码:internalsealedclassConfigurableArrayPool:ArrayPool{internalConfigurableArrayPool():this(1048576,50){}internalConfigurableArrayPool(intmaxArrayLength,intmaxArraysPerBucket){intnum=Utilities.SelectBucketIndex(maxArrayLength);Bucket[]array=newBucket[num+1];for(inti=0;i:ArrayPool{internalConfigurableArrayPool():this(1048576,50){}internalConfigurableArrayPool(intmaxArrayLength,intmaxArraysPerBucket){intnum=Utilities.SelectBucketIndex(maxArrayLength]);Bucket[]etnum+Bucket=newfor(inti=0;i.Create();varbytes=arrayPool.Rent(10);for(inti=0;i