如果不停的 new 数组,可能会造成 GC 的压力,因此在 aspnetcore 中推荐使用 ArrayPool 来重用数组,本文将介绍如何使用 ArrayPool。

使用 ArrayPool

ArrayPool 是一个静态类,它提供了一个共享的数组池,可以用来重用数组。它可以用来避免频繁的分配和回收数组,从而减少 GC 的压力。

ArrayPool 的使用非常简单,只需要调用它的静态方法 Rent 即可。Rent 方法有两个参数,第一个参数是数组的长度,第二个参数是数组的最小长度。如果你不知道数组的最小长度,可以传递一个默认值,比如 16。下面是一个使用 ArrayPool 的 C# 示例:

using System;
using System.Buffers; class Program
{
static void Main(string[] args)
{
// 创建一个数组池
var pool = ArrayPool<int>.Shared; // 从池中获取一个长度为 10 的数组
int[] array = pool.Rent(10);
try
{
// 在数组中填充一些数据
for (int i = 0; i < array.Length; i++)
{
array[i] = i;
} // 使用数组中的数据
foreach (int i in array)
{
Console.WriteLine(i);
}
}
finally
{
// 将数组归还到池中
pool.Return(array);
}
}
}

在上面的示例中,我们首先通过调用 ArrayPool.Shared 来获取一个数组池的实例。接下来,我们通过调用 pool.Rent(10) 方法从池中获取一个长度为 10 的整数数组。在数组中填充数据后,我们遍历数组并输出其中的元素。最后,我们通过调用 pool.Return(array) 方法将数组归还到池中。

需要注意的是,在使用完数组后,必须将其归还到池中,否则该数组将一直占用池中的内存,导致内存泄漏。

使用场景

一个典型的场景是在高吞吐量的网络应用程序中,例如 Web 服务器或消息队列服务器中。这些服务器需要处理大量的网络请求或消息,这些请求或消息可能涉及到大量的内存分配和释放。如果在每个请求或消息处理期间都需要分配和释放内存,那么垃圾回收器将面临重大的压力,导致系统性能下降。

使用 ArrayPool 可以通过池化内存缓解这种情况。这样,当需要分配数组时,可以从池中获取可用的数组而不是分配新的数组,从而减少垃圾回收的压力。一旦使用完毕,将数组返回到池中,以便可以重复使用。

例如,一个 HTTP 服务器可能需要同时处理多个客户端请求,每个请求都需要读取和处理请求正文。在这种情况下,可以使用 ArrayPool 来池化内存,以便在每个请求处理期间重复使用相同的缓冲区。这将减少内存分配和垃圾回收的开销,从而提高服务器的性能和吞吐量。

总结

ArrayPool 是一个静态类,它提供了一个共享的数组池,可以用来重用数组。它可以用来避免频繁的分配和回收数组,从而减少 GC 的压力。

参考

感谢阅读,如果觉得本文有用,不妨点击推荐或者在评论区留下 Mark,让更多的人可以看到。

欢迎关注作者的微信公众号“newbe技术专栏”,获取更多技术内容。


  1. https://learn.microsoft.com/dotnet/api/system.buffers.arraypool-1?view=net-7.0&WT.mc_id=DX-MVP-5003606

如何使用 ArrayPool的更多相关文章

  1. 数组(ArrayPool数组池、Span<T>结构)

    前言 如果需要使用相同的类型的多个对象,就可以使用集合和数组,这一节主要讲解数组,其中会重点涉及到Span<T>结构和ArrayPool数组池.我们也会先涉及到简单的数组.多维数组.锯齿数 ...

  2. 使用ArrayPool池化大型数组(翻译)

    原文链接:https://adamsitnik.com/Array-Pool/ 使用ArrayPool 简介 .NET的垃圾收集器(GC)实现了许多性能优化,其中之一就是,设定年轻的对象很快消亡,然而 ...

  3. ArrayPool数组池、Span<T>结构

    数组(ArrayPool数组池.Span<T>结构) 目录 前言 简单的数组.多维数组.锯齿数组 Array类 ArrayPool数组池 Span Span介绍 Span切片 使用Span ...

  4. 如何在 C# 中使用 ArrayPool 和 MemoryPool

    对资源的可复用是提升应用程序性能的一个非常重要的手段,比如本篇要分享的 ArrayPool 和 MemoryPool,它们就有效的减少了内存使用和对GC的压力,从而提升应用程序性能. 什么是 Arra ...

  5. ArrayPool 源码解读之 byte[] 也能池化?

    一:背景 1. 讲故事 最近在分析一个 dump 的过程中发现其在 gen2 和 LOH 上有不少size较大的free,仔细看了下,这些free生前大多都是模板引擎生成的html片段的byte[]数 ...

  6. C# ArrayPool 源码解读之 byte[] 池化

    一:背景 1. 讲故事最近在分析一个 dump 的过程中发现其在 gen2 和 LOH 上有不少size较大的free,仔细看了下,这些free生前大多都是模板引擎生成的html片段的byte[]数组 ...

  7. .Net性能调优-ArrayPool

    定义 高性能托管数组缓冲池,可重复使用,用租用空间的方式代替重新分配数组空间的行为 好处 可以在频繁创建和销毁数组的情况下提高性能,减少垃圾回收器的压力 使用 获取缓冲池实例:Create/Share ...

  8. .NET性能优化-ArrayPool同时复用数组和对象

    前两天在微信后台收到了读者的私信,问了一个这样的问题,由于私信回复有字数和篇幅限制,我在这里统一回复一下.读者的问题是这样的: 大佬您好,之前读了您的文章受益匪浅,我们有一个项目经常占用 7-8GB ...

  9. The week in .NET - 1/12/2015

    On.NET Last week, we had Mads Torgersen on the show to talk about language design in general, and C# ...

  10. nginx学习七 高级数据结构之动态数组ngx_array_t

    1 ngx_array_t结构 ngx_array_t是nginx内部使用的数组结构.nginx的数组结构在存储上与大家认知的C语言内置的数组有相似性.比方实际上存储数据的区域也是一大块连续的内存. ...

随机推荐

  1. Day17.1:静态与非静态的详解

    静态与非静态 静态方法--类方法 是以static为关键词,从属于类,与类共生 public class Students{//class修饰的是一个类,所以这是一个学生类 public static ...

  2. C++ 一个简洁的CHECK宏

    #define CHECK2(condition, message) \ (!(condition)) ? (std::cerr << "Assertion failed: (& ...

  3. virtual继承和不继承

    用virtual修饰的虚函数,用来继承重写,没有virtual修饰的,取决于父类 定义 父类 *x=new 子类 首先父类不能调用子类的函数,自能调用本身的函数,所以,只有两种情况,1.无virtua ...

  4. python3中的常见知识点3------reduce()函数

    python3中的常见知识点3--reduce()函数 python3导入reduce()函数 reduce()函数语法 reduce()举例 其他python3常用函数 参考链接 python3中不 ...

  5. Go语言Golang DevOps运维开发实战

    Go语言Golang DevOps运维开发实战 提高运维意识.从下到上,从上到下的工作都要做好,对上运维工作的价值和含金量可以得到认可,对下我们的工作能够提高效率解放运维.运维意识是很重要,并不是你技 ...

  6. python 数据迁移

    Python数据库迁移 操作数据库 mysql uroot -p create database Python1031 charset=utf8; 数据迁移 from flask_migrate im ...

  7. 记录Typescript的学习调试笔记(比 javascript更具面向对象,强类型检查,静态字段,适合现代的大团队分工与管理风格).

    1.)先来一段Typescript的环境安装. 安装nodejs ,下载地址:https://nodejs.org/en/download/                 //(node-v12.1 ...

  8. [深度学习] ImageAI库使用笔记

    ImageAI是一个Python库,旨在使开发人员,研究人员和学生能够使用简单的几行代码来构建具有独立的深度学习和计算机视觉功能的应用程序和系统. ImageAI的官方GitHub存储库为https: ...

  9. ESXI 7.0封装网卡驱动

    前段时间配置的All In One 主机,由于华擎H410M-ITX/AC主板的板载网卡为intel I219-V,在安装ESXI后网卡无法驱动.查询之后发现原来ESXI7.0.2的版本不含该网卡驱动 ...

  10. vue-element-admin 安装(node方式)

    vue-element-admin node方式安装 需要的环境: git .node.js 1.git clone 项目(2选 1) // github https://github.com/Pan ...