C# - 如何判断系统是否启用虚拟内存/页面文件?

6
我有一个应用程序需要大量的RAM,我要将其部署给用户。一些用户在运行它时遇到了内存不足的异常,我注意到这是因为他们关闭了系统页文件(因为现在谁会使用16GB的内存呢?叹气...)。我想检测用户是否已经关闭了这个设置(或者其他设置),以便我可以警告他们,因为我们很多用户向我们寻求支持,我希望能够自动化管理这些用户,以节省我们的时间。
我已经Google过了,但似乎无法获得关于页面文件的信息。具体来说,我指的是在Windows中显示的以下页面中可以看到的信息:Page file settings in windows
我知道这是我们最终用户的问题,与我们的应用程序无关(我们的应用程序被设计成使用大量内存,并获得显著的速度优势)。我不确定如何检测这些设置 - 有人有想法吗?
3个回答

6

在此之前,您需要添加对System.Management的引用。

AllocatedBaseSize将以MB为单位显示当前页面文件大小。

using (var query = new ManagementObjectSearcher("SELECT AllocatedBaseSize FROM Win32_PageFileUsage"))
        {
            foreach (ManagementBaseObject obj in query.Get())
            {
                uint used = (uint)obj.GetPropertyValue("AllocatedBaseSize");
                Console.WriteLine(used);
            }
        }

最大大小以MB为单位显示最大页面文件大小时,如果用户设置了最大大小(如果系统管理它,则查询不会返回任何内容)。

using (var query = new ManagementObjectSearcher("SELECT MaximumSize FROM Win32_PageFileSetting"))
        {
            foreach (ManagementBaseObject obj in query.Get())
            {
                uint max = (uint)obj.GetPropertyValue("MaximumSize");
                Console.WriteLine(max);
            }
        }

如果AllocatedBaseSize小于您的应用程序将使用的大小,并且MaximumSize足够大(或者它是系统管理的),则需要考虑存储空间不足以使Windows增加页面文件的边缘情况。即使在开始时有足够的空间,用户也可能在运行您的应用程序时在其他程序上下载大文件或渲染大型视频。考虑提供“低存储”模式,其中您的应用程序可能运行更慢,但不会消耗太多内存。

谢谢!这正是我需要的。我知道它在WMI中,但不确定具体位置。 - Mgamerz

4
虽然我没有完整的解决方案,但我认为您需要的信息可以从Win32_PageFileUsage WMI类中检索到。 AllocatedBaseSize属性应包含您需要的信息:

AllocatedBaseSize

数据类型:uint32

访问类型:只读

限定词: MappingStrings(“Win32API | MEMORYSTATUS | dwTotalPageFile”),单位 (“兆字节”)

用于此页面文件的实际磁盘空间分配的实际数量。此值对应于在InitialSize和MaximumSize属性下设置的Win32_PageFileSetting中建立的范围,在系统启动时进行设置。例如:178


0
    public bool IsPagingEnabled
    {
        get
        {
            var pagingFileStrings = (string[])Registry.GetValue(@"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management", "PagingFiles", null);
            if (pagingFileStrings == null)
                return false;

            foreach (var pagingFile in pagingFileStrings)
                if (pagingFile != null && !string.IsNullOrEmpty(pagingFile))
                    return true;

            return false;
        }
    }

请您在答案中解释一下这段代码为什么有效吗?这将使任何人更容易将其识别为一个好的答案! - Giulio Caccin
由于有大量人访问此网站,因此解释您的答案为什么适用于他们的问题是一个好主意。我建议进行简要编辑以解释清楚。 - user10039288

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接