gpt4 book ai didi

asp.net - 为什么(以及如何)将 ASP.NET 缓存存储在非托管内存中?

转载 作者:IT王子 更新时间:2023-10-28 23:29:41 27 4
gpt4 key购买 nike

好的,各位 ASP.NET 专家:我使用反射器查看 ASP.NET 缓存实现(位于 HttpRuntime.CacheHttpContext.Current.Cache) 在内部使用 Hashtable 来保存缓存。

但是,数据存储在非托管内存中。这很奇怪,因为我看不到任何数据存储在非托管内存中。但是,编写一个非常简单的 Web 应用程序,将一大块字节数组插入缓存,我们可以看到:

enter image description here

  • 私有(private)字节:460MB
  • 所有堆中的字节数:150MB

=>

托管内存:150 MB

非托管内存:310 MB

所以基本上我多次调用应用程序(每次增加是 1000 次请求,每个请求将 64KB 空缓冲区 byte[] 放入缓存)。因此,增长最多的是私有(private)字节(总内存),而不是所有堆中的字节(托管内存)。但是,我希望托管内存随着总内存增长,因为我正在使用 Hashtable 将对象添加到托管堆中。

你能解释一下这种行为吗?


更新

正如 Simon 所说,所有堆值中的字节仅在垃圾收集后发生变化 - 我更改了代码以引发垃圾收集并更新计数器。第 2 代堆内存的增加与添加的内存量完全相同。但是,非托管内存仍然高得多。在此示例中,堆 2 仅为 96MB,而总内存为 231 MB。

enter image description here

最佳答案

# Bytes in all Heaps 仅在执行垃圾回收时更新,而 Private Bytes 以更快的更新速率提供。 (我不确定这个数字来自哪里、内部以及更新频率。)

Private Bytes 的数量在 17:42:45 之后增加。这个数量似乎与大约 17:43:10 的 # Bytes in all Heaps 的值跳跃相匹配。在完成任何垃圾收集并更新 # Bytes in all Heapscounter 之前,似乎需要 20-25 秒。

很难从屏幕截图中显示的几分钟的性能计数器中了解内存分配的工作原理。 ;) 继续运行您的测试,看看您的期望如何在更长的时间内发挥作用。

TL;DR:托管字节的数量应该与私有(private)字节相关,但托管计数器只会在垃圾回收期间更新。


来自 OP 的小提示:正如这个回复所说,内存中的滞后可以通过滞后 GC 来完全解释。非托管内存也增加的事实不是我的问题。所以谢谢@Simon。

关于asp.net - 为什么(以及如何)将 ASP.NET 缓存存储在非托管内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19365151/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com