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 下获得可用的虚拟和物理内存大小?
基础教程推荐
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- SSE 浮点算术是否可重现? 2022-01-01
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- c# Math.Sqrt 实现 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- 如何激活MC67中的红灯 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- rabbitmq 的 REST API 2022-01-01