Ok, więc używam WMI (.net/C#), aby stale zbierać dane o określonym procesie uruchomionym na komputerze. Dostaję dane przez klasę Win32_PerfFormattedData_PerfProc_Process. Że klasa ma wiele właściwości, ale ci, że jesteśmy zainteresowani są następujące:Jak obliczyć użycie pamięci w Menedżerze zadań?
uint64 PageFileBytes;
wartość w bajtach, że proces ten został użyty w pliku (ów) stronicowania. Pliki stronicowania przechowują strony pamięci używane przez proces, które nie są zawarte w innych plikach. Pliki stronicowania są wspólne dla wszystkich procesów, a brak miejsca w plikach stronicowania może uniemożliwić innym procesom przydzielanie pamięci.
uint32 PoolNonpagedBytes;
wartość w bajtach w puli niestronicowanej, obszar pamięci systemowej (pamięci fizycznej wykorzystywane przez system operacyjny) dla obiektów, które nie mogą być zapisywane na dysku, ale musi pozostać w pamięci fizycznej, o ile są przydzielane. PulaNonpagedBytes w Win32_PerfFormattedData_PerfOS_Memory jest obliczana inaczej niż właściwość PoolPagedBytes w Win32_PerfFormattedData_PerfProc_Process, więc może nie być równa sumie PoolPagedBytes dla wszystkich wystąpień Win32_PerfFormattedData_PerfProc_Process. Ta właściwość wyświetla tylko ostatnią obserwowaną wartość; to nie jest średnia.
uint32 PoolPagedBytes;
wartość w bajtach w puli stronicowanej, obszar pamięci systemowej (pamięci fizycznej używanej przez system operacyjny) dla obiektów, które mogą być zapisywane na dysku, gdy nie są one używane. Właściwość PoolNonpagedBytes w Win32_PerfFormattedData_PerfOS_Memory jest obliczana inaczej niż właściwość PoolPagedBytes w Win32_PerfFormattedData_PerfProc_Process, więc może nie być równa sumie PoolPagedBytes dla wszystkich wystąpień Win32_PerfFormattedData_PerfProc_Process. Ta właściwość wyświetla tylko ostatnią obserwowaną wartość; to nie jest średnia.
uint64 PrivateBytes;
Bieżąca wartość w bajtach przydzielona przez ten proces, której nie można udostępnić innym procesom.
uint64 VirtualBytes;
Bieżący rozmiar w bajtach wirtualnej przestrzeni adresowej, której używa proces. Korzystanie z wirtualnej przestrzeni adresowej niekoniecznie oznacza odpowiednie użycie dysku lub stron pamięci głównej. Przestrzeń wirtualna jest skończona i przy użyciu zbyt dużej ilości proces może ograniczyć możliwość ładowania bibliotek.
uint64 WorkingSet;
Maksymalna liczba bajtów w zestawie roboczym tego procesu w dowolnym momencie. Zestaw roboczy to zestaw stron pamięci ostatnio dotkniętych wątkami w procesie. Jeśli wolna pamięć w komputerze przekracza próg, strony pozostaną w roboczym zestawie procesu, nawet jeśli nie są używane. Gdy wolna pamięć spadnie poniżej wartości progowej, strony zostaną obcięte z zestawów roboczych. Jeśli są one wymagane, są one następnie łagodnie powleczone z powrotem do zestawu roboczego, zanim opuszczą pamięć główną.
Obecnie używam pola WorkingSet
do zgłaszania zużycia pamięci procesu. Jednak nie jest to zgodne z tym, co pokazuje Menedżer zadań. Próbowałem z PrivateBytes
, ale to też nie jest "poprawne". Proces, który monitoruje aplikacja, jest procesem .NET (jeśli w ogóle ma to znaczenie), a aplikacja pobiera co najmniej 100 MB więcej pamięci niż to, co wyświetla Menedżer zadań w tym samym czasie.
Pytanie więc, jaka jest "formuła" do obliczenia najlepszego przybliżenia użycia pamięci procesowej, jak pokazuje Menedżer zadań?