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

C# - How to tell if system has virtual memory / page file on?

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

我用谷歌搜索了一下,似乎找不到获取页面文件信息的方法。具体来说,我说的是你可以在 windows 这个页面看到的信息:

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

虽然我没有适合您的完整工作解决方案,但我认为您可以从 Win32_PageFileUsage WMI class 中检索到您需要的信息。 AllocatedBaseSize 属性 应该包含您要查找的信息:

AllocatedBaseSize

Data type: uint32

Access type: Read-only

Qualifiers: MappingStrings ("Win32API|MEMORYSTATUS|dwTotalPageFile"), units ("megabytes")

Actual amount of disk space allocated for use with this page file. This value corresponds to the range established in Win32_PageFileSetting under the InitialSize and MaximumSize properties, set at system startup. Example: 178

您需要事先添加对 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 为单位的最大页面文件大小,但 如果 用户设置了最大大小(如果系统管理它,查询将不会return 任何东西)。

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 增加页面文件。即使一开始有足够的 space,用户也可能在 运行 使用您的应用程序时在其他程序上下载大文件或渲染大视频。考虑提供 'low storage' 模式,您的应用程序可能 运行 速度较慢但不会消耗太多内存。

    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;
        }
    }