什么时候去对象池?

ACP*_*ACP 6 c# memory-management object pooling

何时使用C#进行对象池化?任何好的前...

维护经常使用的对象池并从池中抓取一个而不是创建一个新对象的专业人员和成员是什么?

Mik*_*scu 5

我会将内存碎片添加到列表中.当使用封装本机资源的对象时,可能会发生这种情况,这些资源在分配后无法由垃圾收集器移动,并且可能会使堆碎片化.

一个真实的例子是当你创建和销毁大量套接字时.他们用来读取/写入数据的缓冲区必须固定,以便传输到本机WinSock API,这意味着当垃圾收集发生时,即使某些内存被回收用于被破坏的套接字 - 它可能会留下内存处于碎片状态,因为GC在收集后无法压缩堆.因此,读/写缓冲区是池的主要候选者.此外,如果您正在使用SocketEventArgs对象,那些也是很好的候选对象.

这是一篇很好的文章,讨论垃圾收集过程,内存压缩以及对象池有用的原因.


Aar*_*ght 5

我能想到的只有两种类型的资源通常是汇集的:线程和连接(即数据库).

这两者都有一个首要问题:稀缺性.

  • 如果创建太多线程,则上下文切换会浪费所有CPU时间.
  • 如果您创建了太多的网络连接,那么维护这些连接的开销就会比连接应该做的更多.
  • 此外,对于数据库,出于许可原因,可能会限制连接计数.

因此,您想要创建资源池的主要原因是,您在任何时候都只能承受有限数量的资源池.