How to get available virtual and physical memory size under Mono?(如何在 Mono 下获得可用的虚拟和物理内存大小?)
问题描述
在 Mono 下运行时,有没有办法获得可用虚拟和物理内存大小?
Is there any way to get available virtual and physical memory size when running under Mono?
推荐答案
你可以使用 "free" 命令的这个实现 (UNIX) 找出已用和可用的物理内存(恕我直言,这是最好的选择):
You could use this implementation of the "free" command (UNIX) to find out used and available physical memory (it is the best option IMHO):
using System;
using System.Text.RegularExpressions;
using System.IO;
namespace FreeCSharp
{
class MainClass
{
public static void Main(string[] args)
{
FreeCSharp free = new FreeCSharp();
free.GetValues();
long buffersPlusCached = free.Buffers + free.Cached;
long mainUsed = free.MemTotal - free.MemFree;
// What you would get from free command:
Console.WriteLine("-/+ buffers/cache: {0} {1}", (mainUsed - buffersPlusCached), (free.MemFree + buffersPlusCached));
// What means:
Console.WriteLine("Used physical memory: {0} kB", mainUsed - buffersPlusCached);
Console.WriteLine("Available physical memory: {0} kB", free.MemFree + buffersPlusCached);
}
}
/// <summary>
/// FreeCSharp: quick implementation of free command (kind of) using C#
/// </summary>
public class FreeCSharp
{
public long MemTotal { get; private set; }
public long MemFree { get; private set; }
public long Buffers { get; private set; }
public long Cached { get; private set; }
public void GetValues()
{
string[] memInfoLines = File.ReadAllLines(@"/proc/meminfo");
MemInfoMatch[] memInfoMatches =
{
new MemInfoMatch(@"^Buffers:s+(d+)", value => Buffers = Convert.ToInt64(value)),
new MemInfoMatch(@"^Cached:s+(d+)", value => Cached = Convert.ToInt64(value)),
new MemInfoMatch(@"^MemFree:s+(d+)", value => MemFree = Convert.ToInt64(value)),
new MemInfoMatch(@"^MemTotal:s+(d+)", value => MemTotal = Convert.ToInt64(value))
};
foreach (string memInfoLine in memInfoLines)
{
foreach (MemInfoMatch memInfoMatch in memInfoMatches)
{
Match match = memInfoMatch.regex.Match(memInfoLine);
if (match.Groups[1].Success)
{
string value = match.Groups[1].Value;
memInfoMatch.updateValue(value);
}
}
}
}
public class MemInfoMatch
{
public Regex regex;
public Action<string> updateValue;
public MemInfoMatch(string pattern, Action<string> update)
{
this.regex = new Regex(pattern, RegexOptions.Compiled);
this.updateValue = update;
}
}
}
}
或者,它可以使用 sysconf (UNIX)获取当前可用的物理内存页面.该值取决于操作系统缓存了多少数据,因此,您应该执行 echo 3 >/proc/sys/vm/drop_caches
在运行此代码之前:
Alternatively, it could be used sysconf (UNIX) to get the currently available pages of physical memory. This value depends on how many data the OS has cached, because of that, you should execute echo 3 > /proc/sys/vm/drop_caches
before running this code:
using System;
using Mono.Unix.Native;
OperatingSystem os = Environment.OSVersion;
PlatformID pid = os.Platform;
if (pid == PlatformID.Unix || pid == PlatformID.MacOSX) {
long pages = Syscall.sysconf (SysconfName._SC_AVPHYS_PAGES);
long page_size = Syscall.sysconf (SysconfName._SC_PAGESIZE);
Console.WriteLine("The number of currently available pages of physical memory: {0}, Size of a page in bytes: {1} bytes", pages, page_size);
Console.WriteLine("Mem: {0} bytes", pages * page_size);
}
这篇关于如何在 Mono 下获得可用的虚拟和物理内存大小?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何在 Mono 下获得可用的虚拟和物理内存大小?


- 如何用自己压缩一个 IEnumerable 2022-01-01
- C# 中多线程网络服务器的模式 2022-01-01
- 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
- 输入按键事件处理程序 2022-01-01
- C#MongoDB使用Builders查找派生对象 2022-09-04
- 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01
- WebMatrix WebSecurity PasswordSalt 2022-01-01
- Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
- MoreLinq maxBy vs LINQ max + where 2022-01-01
- 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01