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;
}
}
我有一个部署给用户的应用程序消耗大量 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;
}
}