检测即将耗尽的内存(获取"免费物理内存"的数量)

Dar*_*nda 6 c# memory memory-management

我正在将图像从高FPS相机传输到内存缓冲区(列表),并且由于这些图像非常大,因此计算机的内存耗尽非常快.

我想要做的是在应用程序内存不足之前停止传输一段时间.在我的测试过程中,我发现它与"Free Physical Memory"指标一致,接近于零.

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

替代文字

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

有任何想法吗?

更新 不幸的是,我需要数据在内存中(是的,我知道我不能保证它将在物理内存中,但仍然),因为数据是实时流式传输的,我需要在内存中预览它它被存储在那里.

Eri*_*ert 9

相关性不是因果关系.即使物理内存仍然空闲,您也可以"耗尽内存" .物理记忆几乎肯定无关紧要; 你可能用完的是地址空间.

人们倾向于将"记忆"视为消耗芯片上的空间,但十多年来情况并非如此.现代操作系统中的内存通常被认为是一个大型磁盘文件,其上面有一个大硬件缓存以加快速度.物理内存只是基于磁盘的内存的性能优化.

如果你的物理内存不足,那么你的表现会很糟糕.但是稀缺的资源实际上是你正在耗尽的地址空间.一个大的列表必须有一个大的连续的地址空间块,并且可能没有任何块大到你想要的大小.

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


Owe*_*enP 7

我迟到了,但您考虑过使用System.Runtime.MemoryFailPoint类吗?它做了很多事情来确保请求的分配成功,如果失败则抛出InsufficientMemoryException; 你可以抓住这个并停止转移.您可以预测传入帧的平均大小,并尝试分配3或4个帧,然后在发生故障时停止采集.也许是这样的?

const int AverageFrameSize = 10 * 1024 * 1024 // 10MB

void Image_OnAcquired(...)
{
    try
    {
        var memoryCheck = new MemoryFailPoint(AverageFrameSize * 3);
    }
    catch (InsufficientMemoryException ex)
    {
        _camera.StopAcquisition();
        StartWaitingForFreeMemory();
        return;
    }

    // if you get here, there's enough memory for at least a few
    // more frames
}
Run Code Online (Sandbox Code Playgroud)

我怀疑它是100%万无一失,但这是一个开始.由于其他答案中解释的原因,它肯定比性能计数器更可靠.