如果不停的 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

最新文章

  1. MSSQLServer中组织或分类表的设计及其递归查询
  2. Html,Css,Dom,javascript细节总结
  3. mysql 错误 1221 Incorrect usage of union and order by
  4. Android工程文件下assets文件夹与res文件夹的区别
  5. CentOS7下安装soaplib
  6. SQL Server 父子迭代查询语句,树状查询(转)
  7. [家里蹲大学数学杂志]第041期中山大学数计学院 2008 级数学与应用数学专业《泛函分析》期末考试试题 A
  8. html及css常用的单词
  9. iOS YSDropdownMagnify 下拉放大,向上导航显示
  10. Gulp.js - 简单、直观的自动化项目构建工具
  11. GVIM:在WINDOWS下清爽写代码
  12. version_info
  13. Python 异常结构
  14. kvm上安装xp
  15. JavaSE基础篇—流程控制语句
  16. CMDB资产管理系统开发【day26】:admin action
  17. 2017-12-15python全栈9期第二天第七节之数字转换成布尔值
  18. Angular 快速入门
  19. python shlex 模块
  20. Java 中的语法糖(7/15整个周六上午总结)

热门文章

  1. Encodings: URL
  2. 自动增加 Android App 的版本号
  3. 写一个linux平台的桌面宠物
  4. .net 温故知新:【10】.NET ORM框架EFCore使用入门之CodeFirs、DBFirst
  5. 定制.NET 6.0的Middleware中间件
  6. 如何在C#中接受或拒绝 Excel 中的修订
  7. 读python代码-学到的python函数-1
  8. 买不到的数目【第四届蓝桥杯省赛C++A组,第四届蓝桥杯省赛JAVAC组】
  9. 洛谷 P1094纪念品分组 题解
  10. 保姆级手把手图文并茂教你配置MAC系统Flutter环境