Хобрук: Ваш путь к мастерству в программировании

Как получить объем физической памяти, кэшированной и свободной в Windows 7?

Я пытаюсь имитировать диспетчер задач Windows 7 (только вкладка «Производительность») на C #, и хотя мне удалось получить большинство значений, я не могу получить кэшированные и свободные байтовые значения для физической памяти. Я знаю, что по определению они имеют в виду:

  • Кэширование - это объем физической памяти, использованной в последнее время для системных ресурсов.
  • Свободная - это объем памяти, который в настоящее время не используется или не содержит полезной информации (в отличие от кешированных файлов, которые действительно содержат полезную информацию).

Но ни один из моих подходов не дал точного значения, указанного в диспетчере задач. например:

Сохранено в кеше:

PerformanceCounter PC4 = new PerformanceCounter();
PC4.CategoryName = "Memory";
PC4.CounterName = "Cache Bytes";
PC4.InstanceName = "";
Console.WriteLine((Int32)(PC4.NextValue() / (1024 * 1024)));

Бесплатно:

ObjectQuery wql = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wql);
ManagementObjectCollection results = searcher.Get();
object ob = 0;
foreach (ManagementObject result in results)
{
  ob = result["FreePhysicalMemory"];
}//returns physical memory's <i>Available</i> byte, NOT <i>Free</i>

Что мне не хватает?


  • Вам не хватает еще нескольких счетчиков, которые входят в скобку Cached. Как и резервные байты резервного кэша. Спросите на superuser.com, как они складываются. 27.02.2014
  • Есть идеи, как получить эти значения с точки зрения C #? 27.02.2014

Ответы:


1

Вы можете попробовать взглянуть на класс System.Diagnostics.Process. Я думаю, что вас интересует Process.PagedMemorySize. Следующий пример кода выдаст список запущенных процессов и их использование памяти:

Process[] processlist = Process.GetProcesses();

foreach(Process p in processlist){
    Console.WriteLine(“Process: {0} ID: {1} MEM:{2}”, p.ProcessName, p.Id, theprocess.PagedMemorySize);
}

Если PagedMemorySize не тот, попробуйте VirtualMemorySize64

http://msdn.microsoft.com/en-us/library/system.diagnostics.process(v=vs.110).aspx

26.02.2014
  • В Process много свойств, связанных с памятью, и я не знаком со всеми из них, поэтому вам стоит их проверить. 26.02.2014
  • Я попытался суммировать количество WorkingSet64,, NonpagedSystemMemorySize64, VirtualMemorySize64, PagedMemorySize64 и PrivateMemorySize64 для каждого процесса (последние два фактически возвращают одно и то же число). Ни один из них не соответствует Cached или Free ram. 27.02.2014

  • 2

    Вам необходимо добавить ссылки на Microsoft.VisualBasic, чтобы использовать следующее:

    using System.Runtime.InteropServices;
    using Microsoft.VisualBasic.Devices;
    
    public class MemStat
    {
        public ulong Available { get; set; }
    
        public ulong Total { get; set; }
    
        public ulong PhysicalMemoryInUse { get; set; }
    
        public ulong Free { get; set; }
    
        public ulong Cached { get; set; }
    
        public MemStat()
        {
            ObjectQuery wql = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
    
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(wql);
    
            ManagementObjectCollection results = searcher.Get();
    
            var Available = new ComputerInfo().AvailablePhysicalMemory;
    
            this.Available = Available;
    
            var Total = new ComputerInfo().TotalPhysicalMemory;
    
            this.Total = Total;
    
            var PhysicalMemoryInUse = Total - Available;
    
            this.PhysicalMemoryInUse = PhysicalMemoryInUse;
    
            Object Free = new object();
    
            foreach (var result in results)
            {
                Free = result["FreePhysicalMemory"];
    
                this.Free = ulong.Parse(Free.ToString());
    
            }
    
            var Cached = Total - PhysicalMemoryInUse - ulong.Parse(Free.ToString());
    
            this.Cached = Cached;
    
        }
    

    Тогда используйте это так:

            ulong TotalMemory = new MemStat().Total;
            ulong FreeMemory = new MemStat().Free;
    
            Console.BackgroundColor = ConsoleColor.Blue;
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("    **** MY WINDOWS PROGRAM ****     ");
            Console.WriteLine("" + (TotalMemory/1024) + "K RAM SYSTEM " + FreeMemory + " BYTES FREE");
    
    19.06.2015
    Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..