加入收藏 | 设为首页 | 会员中心 | 我要投稿 张家口站长网 (https://www.0313zz.com.cn/)- 办公协同、操作系统、混合云网络、数据湖、视觉智能!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

池化对象 RecyclableMemoryStream 在 .netcore 中的使用

发布时间:2021-03-31 14:34:04 所属栏目:外闻 来源:互联网
导读:意思很明显,专用于取代 MemoryStream 而生,RecyclableMemoryStream 可以最大限度的避免 Stream 操作在 GC 上的 LOH (大对象堆)的分配和内存碎片,泄露等烦人的问题,这篇文章我们将会讨论 Microsoft.IO.RecyclableMemoryStream 及如何在 .NET Core 应用程

意思很明显,专用于取代 MemoryStream 而生,RecyclableMemoryStream 可以最大限度的避免 Stream 操作在 GC 上的 LOH (大对象堆)的分配和内存碎片,泄露等烦人的问题,这篇文章我们将会讨论 Microsoft.IO.RecyclableMemoryStream 及如何在 .NET Core 应用程序中提升性能。

RecyclableMemoryStream 的价值

RecyclableMemoryStream 大体上提供了如下四点价值。

  • 使用缓冲池避免 LOH 分配。
  • 大大的减少生成到2代堆的可能,相对减少了 GC 回收时造成的线程停滞时间。
  • 避免了内存碎片和内存泄漏。
  • 提供了用于跟踪和分析性能的度量值。

RecyclableMemoryStream 的原理

RecyclableMemoryStream 在2代堆上存储了一个用于流的大型缓冲区,并能够确保这个缓冲区在进程的生命周期内一直存在,这就确保了GC不会频繁的出现全量回收,同时 RecyclableMemoryStreamManager 类维护了两类缓冲池。

  • 小型缓冲池 常用于读写操作,每一个小池子大小为 128k。
  • 大型缓冲池 常用于当有连续缓冲的场景下使用,每一个大池子大小为 1MB。

值得注意的是,大型缓冲池的扩容又分为 线性增长 和 指数型增长,可以看出内存可被高效的反复使用并且对调用者还是无感知的,这就是为什么 RecyclableMemoryStream 比 MemoryStream 更好更高效的原因。

当调用 GetBuffer() 方法时,小缓冲区将会转换为一个大的连续缓冲区,如下代码所示

(编辑:张家口站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读