c# - 检测何时即将耗尽内存(获取 "free physical memory"的数量)

标签 c# memory memory-management

我正在将图像从高 FPS 相机传输到内存缓冲区(列表)中,由于这些图像非常大,计算机很快就会耗尽内存。

我想做的是在应用程序耗尽内存之前停止传输。在我的测试中,我发现它与接近于零的“可用物理内存”指标一致。

现在的问题是我无法找到以编程方式实际获取此值的方法;在 XP 中,它甚至不会显示在任何地方(仅在 Vista/7 任务管理器中)。

alt text

我已经尝试了所有我能找到的方法(WMI、性能计数器、MemoryStatus ......),但我从中得到的只是“可用物理内存”,这当然不一样。

有什么想法吗?

更新 不幸的是,我需要将数据放在内存中(是的,我知道我不能保证它会在物理内存中,但仍然如此),因为数据是实时流式传输的,我需要保存后在内存中预览。

最佳答案

相关性不是因果关系。即使 物理 内存负载仍然可用,您也可能“内存不足”。物理内存几乎可以肯定是无关紧要的。您可能用完的是地址空间

人们倾向于将“内存”视为占用芯片上的空间,但十多年来并非如此。现代操作系统中的内存通常更好地被认为是一个大磁盘文件,它上面有一个大的硬件缓存来加速它。 物理内存只是基于磁盘的内存的性能优化

如果你的物理内存用完了,那么你的表现将会很糟糕。但稀缺资源实际上是您即将用完的地址空间。一个大列表必须有一个大的连续地址空间 block ,并且可能没有任何足够大的 block 以您想要的大小。

不要那样做。拉下一个合理大小的 block ,将其转储到磁盘,然后根据需要处理磁盘上的文件。

关于c# - 检测何时即将耗尽内存(获取 "free physical memory"的数量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4478216/

相关文章:

c - munmap_chunk() : invalid pointer error

c# - DataTable.Select 与 List.FindAll

c# - 我如何打破这个特定的 while 循环?

c# - Azure 函数 - 从 DefaultCredentials\Managed Identity 获取 token

python - 如何在 Python 中获取数字列表的内存印记?

iphone - 如何通过从屏幕上删除 UIImageViews 来安全地释放内存?

c# - 带有 DateTimeOffset 的 OData 函数?范围

Objective-C 重用 NSString 内存泄漏

c# - 我是否需要自己在 xamarin.forms 中清理内存?

java - sbt 不会组装 Spark