Vraag C # Krijg gebruikt geheugen in%


Ik heb een performancecounter gemaakt die het totale geheugengebruik in% kan controleren, maar het probleem is dat het me niet dezelfde waarde geeft als in taakbeheer laat zien. bijvoorbeeld: mijn programma zegt 34%, maar Taakmanager zegt 40%.

Om het even welke ideeën?

NOTITIE
Ik probeer de beschikbare RAM van het systeem te krijgen, niet de gebruikte RAM door een proces.

Huidige code

private PerformanceCounter performanceCounterRAM = new PerformanceCounter();

performanceCounterRAM.CounterName = "% Committed Bytes In Use";
performanceCounterRAM.CategoryName = "Memory";

progressBarRAM.Value = (int)(performanceCounterRAM.NextValue());
            labelRAM.Text = "RAM: " + progressBarRAM.Value.ToString(CultureInfo.InvariantCulture) + "%";

BEWERK
Ik vernieuw de voortgangsbalk en het label elke seconde met een timer.


35
2018-04-05 11:01


oorsprong


antwoorden:


U zou GetPerformanceInfo Windows API kunnen gebruiken, deze toont exact dezelfde waarden als Windows Task Manager op Windows 7, hier is de console-applicatie die het beschikbare fysieke geheugen krijgt, u kunt gemakkelijk andere informatie krijgen die GetPerformanceInfo weergeeft, MSDN raadplegen PERFORMANCE_INFORMATION structuurdocumentatie om te zien hoe je de waarde in MiB kunt berekenen, eigenlijk zijn alle SIZE_T-waarden in pagina's, dus moet je het vermenigvuldigen met PageSize.

Update: ik heb deze code bijgewerkt om het percentage weer te geven, het is niet optimaal omdat het tweemaal de GetPerformanceInfo aanroept, maar ik hoop dat je het idee krijgt.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplicationPlayground
{
  class Program
  {
    static void Main(string[] args)
    {
      while (true)
      {
        Int64 phav = PerformanceInfo.GetPhysicalAvailableMemoryInMiB();
        Int64 tot = PerformanceInfo.GetTotalMemoryInMiB();
        decimal percentFree = ((decimal)phav / (decimal)tot) * 100;
        decimal percentOccupied = 100 - percentFree;
        Console.WriteLine("Available Physical Memory (MiB) " + phav.ToString());
        Console.WriteLine("Total Memory (MiB) " + tot.ToString());
        Console.WriteLine("Free (%) " + percentFree.ToString());
        Console.WriteLine("Occupied (%) " + percentOccupied.ToString());
        Console.ReadLine();
      }
    }
  }

  public static class PerformanceInfo
  {
    [DllImport("psapi.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetPerformanceInfo([Out] out PerformanceInformation PerformanceInformation, [In] int Size);

    [StructLayout(LayoutKind.Sequential)]
    public struct PerformanceInformation
    {
      public int Size;
      public IntPtr CommitTotal;
      public IntPtr CommitLimit;
      public IntPtr CommitPeak;
      public IntPtr PhysicalTotal;
      public IntPtr PhysicalAvailable;
      public IntPtr SystemCache;
      public IntPtr KernelTotal;
      public IntPtr KernelPaged;
      public IntPtr KernelNonPaged;
      public IntPtr PageSize;
      public int HandlesCount;
      public int ProcessCount;
      public int ThreadCount;
    }

    public static Int64 GetPhysicalAvailableMemoryInMiB()
    {
        PerformanceInformation pi = new PerformanceInformation();
        if (GetPerformanceInfo(out pi, Marshal.SizeOf(pi)))
        {
          return Convert.ToInt64((pi.PhysicalAvailable.ToInt64() * pi.PageSize.ToInt64() / 1048576));
        }
        else
        {
          return -1;
        }

    }

    public static Int64 GetTotalMemoryInMiB()
    {
      PerformanceInformation pi = new PerformanceInformation();
      if (GetPerformanceInfo(out pi, Marshal.SizeOf(pi)))
      {
        return Convert.ToInt64((pi.PhysicalTotal.ToInt64() * pi.PageSize.ToInt64() / 1048576));
      }
      else
      {
        return -1;
      }

    }
  }
}

48
2018-04-05 12:06



Ik denk dat het percentage fysiek geheugen dat door Taakbeheer wordt gerapporteerd, feitelijk een andere waarde is dan de % Committed Bytes In Use uw PerformanceCounter gebruikt.

Op mijn machine is er een duidelijk verschil van 20% tussen deze waarden wanneer deze worden bekeken in de prestatiemonitor:

enter image description here

Dit artikel geeft aan dat de% Committed Bytes-metriek de grootte van het pagefile in rekening neemt, niet alleen het fysieke geheugen van de machine. Dit zou verklaren waarom deze waarde consistent lager is dan de waarde van Task Manager.

Je hebt misschien meer geluk als je een percentage berekent met de Memory \ Available Bytes metric, maar ik weet niet zeker hoe ik de totale hoeveelheid fysiek geheugen van PerformanceCounter kan ophalen.


6
2018-04-05 11:56



Prestatiemeteritems zijn geen goed idee. Gebruik deze code om% van het geheugengebruik van Task Manager te krijgen

var wmiObject = new ManagementObjectSearcher("select * from Win32_OperatingSystem");

var memoryValues = wmiObject.Get().Cast<ManagementObject>().Select(mo => new {
    FreePhysicalMemory = Double.Parse(mo["FreePhysicalMemory"].ToString()),
    TotalVisibleMemorySize = Double.Parse(mo["TotalVisibleMemorySize"].ToString())
}).FirstOrDefault();

if (memoryValues != null) {
    var percent = ((memoryValues.TotalVisibleMemorySize - memoryValues.FreePhysicalMemory) / memoryValues.TotalVisibleMemorySize) * 100;
}

3
2017-07-15 15:39



U kunt "showbeschrijving" onderaan Prestatiemonitor gebruiken. Om te citeren

% Toegewezen bytes in gebruik is de verhouding tussen geheugen \ toegewezen bytes en geheugenlimiet geheugen begrenzing. Geëngageerd geheugen is het fysieke geheugen in   gebruik voor welke ruimte is gereserveerd in het wisselbestand   moet op schijf worden geschreven. De commit-limiet wordt bepaald door de grootte   van het wisselbestand. Als het wisselbestand wordt vergroot, wordt de commit-limiet ingesteld   verhoogt en de verhouding wordt verlaagd). Deze teller geeft het   huidige percentage alleen; het is geen gemiddelde.

Zooo PM maakt gebruik van het wisselbestand, terwijl TM werkelijke RAM gebruikt.


0
2018-01-04 22:27