【问题标题】:How do I find out how much RAM is actually available for my application?如何找出我的应用程序实际可用的 RAM 量?
【发布时间】:2018-08-06 16:05:08
【问题描述】:

我的 C# 应用程序正在将文件中的图像缓存到 RAM 中,以便它可以更快地向用户显示 (30-60 FPS)。

它们被存储在Bitmap 对象中。

大约 200 张图片后,它会抛出 "System.OutOfMemoryException"

我尝试过使用

System.Diagnostics.PerformanceCounter("Memory", "Available MBytes");

查看上限是多少并尝试保持在上限之下,但它返回的值似乎并不准确匹配。

例如。如果我正常运行它,它会从 1,500 MB 可用空间开始,并在 300 MB 左右抛出异常。

但是,如果我启动像 After Effects 这样的大型应用程序并让它使用我的大量内存。

然后我的应用程序从 300 开始,大约 200 张图像,然后抛出大约 40 MB 的异常,但只有在它已经达到 0 MB 并由于某种原因反弹回来之后。

如何确定我的 C# 应用程序实际可用的 RAM 量,以便知道我可以缓存以供播放的确切图像数量,而无需接近当前 PC 的上限和风险异常?

【问题讨论】:

  • 您确定这不是由其他问题引起的吗?比如没有正确处理你的图片?
  • @Steve 图像没有被处理,因为我希望它们在 RAM 中以便更快地播放。所以问题是,我如何计算有多少图像可用于缓存。

标签: c# memory garbage-collection malloc ram


【解决方案1】:

简答: 使用GlobalMemoryStatusEx Win32 API 的ullAvailPageFile

更多详情:

System.Diagnostics.PerformanceCounter("Memory", "Available MBytes");

上面给出了“物理记忆”

https://blogs.msdn.microsoft.com/faber/2014/11/20/tracking-windows-performance-counters-by-application/

这衡量了可用于运行进程的物理内存量(以兆字节为单位)。

你的机器里总是有“虚拟内存”,很可能是用“页面文件”配置的

程序可以使用的适当度量是:Available Page File

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366770(v=vs.85).aspx

ullAvailPageFile

当前进程可以提交的最大内存量,以字节为单位。此值等于或小于系统范围的可用提交值。

我找不到获取此信息的托管库调用。因此,可以选择使用 pinvoke 直接调用 Win32 API。

https://www.pinvoke.net/default.aspx/kernel32.GlobalMemoryStatusEx

 [return: MarshalAs(UnmanagedType.Bool)]
 [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
 static extern bool GlobalMemoryStatusEx( [In, Out] MEMORYSTATUSEX lpBuffer);

在我的本地测试中,我发现如果可用页面大小小于 1 GB,则程序可能随时开始失败并出现“内存不足”异常。

注意这个值不是一个固定值,它会随着你的程序/其他程序在系统中运行而改变。我的理解是,当您分配内存时,“页面文件”会增长(直到其配置的限制)。

您可能希望将您的应用程序构建为“64 位”应用程序以使用更多内存。

  1. http://blogs.microsoft.co.il/sasha/2012/04/04/what-anycpu-really-means-as-of-net-45-and-visual-studio-11/
  2. .net console app 32 vs 64 bit

对于控制台应用程序,将其设为“任何 CPU”并清除“首选 32 位”复选框

页面文件设置

有关于适当页面文件大小的大量信息。在最简单的情况下,它被设置为可用 RAM 的倍数。

https://support.microsoft.com/en-in/help/2860880/how-to-determine-the-appropriate-page-file-size-for-64-bit-versions-of

Windows 8.1 和 Windows Server 2012 R2

最大页面文件大小

3 × RAM 或 4 GB,以较大者为准。

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 1970-01-01
    • 2013-08-22
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多