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

时间:2018-05-21 02:14:45

标签: c# wmi virtual-memory

我有一个应用程序,它消耗了我部署给用户的大量RAM。我的一些用户在运行时遇到了内存不足的异常 - 我注意到这是因为他们关闭了系统页面文件(因为这些天谁会使用16GB的内存?叹气......)。我想检测用户是否将其设置为关闭(或者可能是其他一些设置),以便我可以向他们发出警告,因为我们有很多用户来找我们寻求支持,我想让一些用户自动化,因为他们正在吃饭我们有很多时间。

我搜索过,我似乎找不到获取页面文件信息的方法。具体来说,我在谈论您可以在Windows中的此页面中看到的信息: Page file settings in windows

我知道这是我们的最终用户问题,与我们的应用程序无关(我们的应用程序旨在消耗大量内存并获得显着的速度优势)。我不确定如何检测这些设置 - 有没有人有想法?

3 个答案:

答案 0 :(得分:4)

虽然我没有为您提供完整的工作解决方案,但我认为您可以从Win32_PageFileUsage WMI class检索您所获得的信息。 AllocatedBaseSize属性应包含您之后的信息:

  

<强> AllocatedBaseSize

     

数据类型:uint32

     

访问类型:只读

     

限定符:   MappingStrings(&#34; Win32API | MEMORYSTATUS | dwTotalPageFile&#34;),单位   (&#34;兆字节&#34;)

     

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

答案 1 :(得分:2)

您需要事先添加对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);
            }
        }

虽然MaximumSize将以MB为单位显示最大页面文件大小,但 if 用户设置最大大小(如果系统管理它,则查询不会返回任何内容)。< / p>

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增长的边缘情况页面文件。即使开头有足够的空间,用户也可以在其他程序上下载大文件或在运行应用程序时渲染大型视频。考虑提供“低存储”模式,您的应用程序可能运行速度较慢但不会消耗尽可能多的内存。

答案 2 :(得分: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;
        }
    }