How to get the available size of virtual and physical memory in Mono?

Is there a way to get virtual and physical memory when working in Mono?

+6
source share
2 answers

You can use this implementation of the "free" command (UNIX) to search for used and available physical memory (this is the best IMHO option):

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

Alternatively, you can use sysconf (UNIX) to get the pages of physical memory that are currently available. This value depends on how much data is cached by the OS, because of this you must do 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); } 
+2
source

I have not used a lot of Mono, but have you tried viewing Mono Profiler logs? I know that they show physical memory, but I'm not sure about virtual ...

Call me curious, but why do you need this? If you are having problems using memory in an application, there are many different methods that you can use to help reduce it ...

Edit: if you look around, there really is no mono-specific way to collect it ... However, depending on how you run your application, you can still access the current process object in C #

 Process currentProcess = System.Diagnostics.Process.GetCurrentProcess(); var physicalMemory = currentProcess.WorkingSet64; var virtualMemory = currentProcess.PeakVirtualMemorySize64; 

Then just use / return those that you consider necessary.

source: MSDN

0
source

Source: https://habr.com/ru/post/948293/


All Articles