Co to jest Bajty prywatne, Bajty wirtualne, zestaw roboczy?

Próbuję użyć narzędzia perfmon windows do debugowania wycieków pamięci w procesie.

Tak perfmon wyjaśnia terminy:

Working Set to bieżący rozmiar, w bajtach, zestawu roboczego tego procesu. Zestaw roboczy to zbiór stron pamięci dotkniętych ostatnio przez wątki w procesie. Jeśli wolna pamięć w komputerze znajduje się powyżej progu, strony pozostają w roboczym zestawie procesu, nawet jeśli nie są używane. Gdy wolna pamięć spadnie poniżej próg, strony są przycinane z zestawów roboczych. Jeśli są one potrzebne, zostaną następnie miękkie-faulowane z powrotem do zestawu roboczego przed opuszczeniem pamięci głównej.

Virtual Bytes to bieżący rozmiar, w bajtach, wirtualnej przestrzeni adresowej, której używa proces. Korzystanie z wirtualnej przestrzeni adresowej nie musi oznaczać odpowiedniego korzystania z obu stron pamięci dyskowej lub głównej. Przestrzeń wirtualna jest skończona, a proces może ograniczyć możliwość ładowania bibliotek.

Private Bytes jest bieżącym rozmiarem, w bajtach, pamięci przydzielonej przez ten proces, której nie można współdzielić z innymi procesami.

Oto pytania, które mam:

czy to prywatne bajty, które powinienem zmierzyć, aby upewnić się, czy proces ma jakiekolwiek przecieki, ponieważ nie obejmuje żadnych bibliotek współdzielonych i wszelkie przecieki, jeśli się wydarzy, będą pochodzić z samego procesu?

Jaka jest całkowita pamięć zużywana przez proces? Czy jest to Bajt wirtualny, czy jest to suma Wirtualne bajty i zestaw roboczy?

czy istnieje jakaś relacja między bajtami prywatnymi, zestawami roboczymi i bajtami wirtualnymi?

czy są jakieś inne narzędzia, które dają lepsze wyobrażenie o zużyciu pamięci?

Author: Jeffmagma, 2009-12-31

4 answers

Krótka odpowiedź na to pytanie jest taka, że żadna z tych wartości nie jest wiarygodnym wskaźnikiem ilości pamięci używanej przez program wykonywalny i żadna z nich nie jest odpowiednia do debugowania wycieku pamięci.

Prywatne bajty odnoszą się do ilości pamięci, o jaką proces wykonywalny poprosił - niekoniecznie takiej ilości, jaką jest faktycznie używająca . Są one "prywatne", ponieważ (zazwyczaj) wykluczają pliki mapowane pamięcią (tj. współdzielone biblioteki DLL). Ale-tu jest haczyk - niekoniecznie wykluczają pamięć przydzieloną przez te pliki . Nie da się stwierdzić, czy zmiana w prywatnych bajtach była spowodowana samym programem wykonywalnym, czy też powiązaną biblioteką. Prywatne bajty są również nie wyłącznie pamięcią fizyczną; mogą być wysyłane na dysk lub na listę stron w trybie gotowości(tzn. nie są już używane, ale jeszcze nie są wysyłane).

Zbiór roboczy odnosi się do całkowitej fizycznej PAMIĘCI (RAM) używanej przez proces. Jednak w przeciwieństwie do prywatnych bajtów, obejmuje to również pliki mapowane w pamięci i różne inne zasoby, więc jest to jeszcze mniej dokładny pomiar niż prywatne bajty. Jest to ta sama wartość, która jest zgłaszana w Menedżerze Zadań "użycie Mem" i była źródłem niekończących się nieporozumień w ostatnich latach. Pamięć w zestawie roboczym jest "fizyczna" w tym sensie, że może być adresowana bez błędu strony; jednak lista stron w trybie gotowości jest również nadal fizycznie w pamięci, ale nie raportowane w zestawie roboczym i dlatego może się zdarzyć, że "użycie Mem" nagle spadnie, gdy zminimalizujesz aplikację.

Wirtualne bajty są całkowitą wirtualną przestrzenią adresową zajmowaną przez cały proces. Jest to jak zestaw roboczy, w tym sensie, że zawiera pliki mapowane w pamięci (współdzielone biblioteki DLL), ale zawiera również dane z listy gotowości i dane, które zostały już wysłane i znajdują się w pliku stron na dysku gdzieś. Całkowita liczba użytych wirtualnych bajtów przez każdy proces w systemie pod dużym obciążeniem doda znacznie więcej pamięci niż maszyna faktycznie ma.

Więc relacje są:

    Pliki prywatne są tym, co Twoja aplikacja faktycznie przydzieliła, ale zawierają użycie pliku stron; Zbiór roboczy to nie stronicowane prywatne bajty plus pliki mapowane w pamięci;
  • wirtualne bajty są zestawem roboczym plus paged prywatnych bajtów i listy gotowości.

Tu jest jeszcze jeden problem; tak samo jak shared biblioteki mogą przydzielać pamięć wewnątrz modułu aplikacji, co prowadzi do potencjalnych fałszywych alarmów zgłaszanych w prywatnych bajtach aplikacji, Twoja aplikacja {[8] } może również skończyć alokacją pamięci wewnątrz modułówwspółdzielonych , co prowadzi do fałszywych negatywów {8]}. Oznacza to, że aplikacja może mieć wyciek pamięci, który nigdy nie przejawia się w prywatnych bajtach. Mało prawdopodobne, ale możliwe.

Prywatne bajty są rozsądnym przybliżeniem z ilości pamięci, której używa Twój plik wykonywalny i może być użyty do pomocy zawęzić listę potencjalnych kandydatów do wycieku pamięci; jeśli widzisz, że liczba rośnie i rośnie stale i bez końca, chcesz sprawdzić ten proces pod kątem wycieku. Nie może to jednak udowodnić , że istnieje lub nie jest przeciek.

Jednym z najskuteczniejszych narzędzi do wykrywania / korygowania wycieków pamięci w systemie Windows jest w rzeczywistości Visual Studio (link idzie do strony na using VS for wycieków pamięci, Nie strony produktu). Racjonalne oczyszczenie to inna możliwość. Microsoft ma również bardziej ogólny dokument dotyczący najlepszych praktyk na ten temat. Istnieje więcej narzędzi wymienionych w tym poprzednie pytanie .

Mam nadzieję, że to wyjaśni kilka rzeczy! Śledzenie wycieków pamięci jest jedną z najtrudniejszych rzeczy do zrobienia w debugowaniu. Powodzenia.

 434
Author: Aaronaught,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:38

Nie należy próbować używać perfmon, Menedżera zadań lub jakiegokolwiek podobnego narzędzia do określania wycieków pamięci. Są dobre do identyfikacji trendów, ale niewiele więcej. Liczby, które zgłaszają w wartościach bezwzględnych, są zbyt niejasne i zagregowane, aby mogły być przydatne w konkretnym zadaniu, takim jak wykrywanie wycieku pamięci.

Poprzednia odpowiedź na to pytanie dała świetne wyjaśnienie, czym są różne rodzaje.

Pytasz o rekomendację narzędzia: Polecam Validator pamięci. Zdolny do monitorowanie aplikacji, które przydzielają miliardy pamięci.

Http://www.softwareverify.com/cpp/memory/index.html

Zastrzeżenie: zaprojektowałem walidator pamięci.

 9
Author: Stephen Kellett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-05 17:25:51

Definicja liczników perfmonów została złamana od początku i z jakiegoś powodu wydaje się zbyt trudna do skorygowania.

Dobry przegląd zarządzania pamięcią systemu Windows jest dostępny w filmie "Tajemnice zarządzania pamięcią ujawnione" na MSDN: obejmuje więcej tematów niż potrzeba do śledzenia wycieków pamięci (np. Zarządzanie zestawami roboczymi), ale zawiera wystarczająco dużo szczegółów w odpowiednich tematach.


Aby dać Ci podpowiedź o problemie z licznikiem perfmon opisy, oto wewnętrzna opowieść o prywatnych bajtach z "licznik wydajności prywatnych bajtów -- Uwaga!" na MSDN:

P: Kiedy prywatny Bajt nie jest prywatnym bajtem?

Odp: kiedy nie jest rezydentem.

Prywatny Licznik bajtów informuje o ładunku zatwierdzania procesu. To znaczy, ilość miejsca, która została przydzielona w pliku wymiany do przechowywania zawartości pamięci prywatnej w przypadku jej wymiany. Uwaga: Unikam słowa "zastrzeżone" z powodu możliwego pomylenia z pamięcią wirtualną w stanie zastrzeżonym, która nie jest zaangażowana.


Od "planowanie wydajności" na MSDN:

3.3 Prywatne Bajty

3.3.1 Opis

Pamięć prywatna, jest zdefiniowana jako pamięć przydzielona procesowi, który nie może być współdzielony przez inne procesy. Pamięć ta jest droższa niż pamięć współdzielona, gdy wykonuje się wiele takich procesów na maszynie. Pamięć prywatna w (tradycyjnych) niezarządzanych bibliotekach DLL zazwyczaj składa się ze statyki C++ i jest rzędu 5% całkowitego zestawu roboczego biblioteki dll.

 7
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-25 15:58:54

Tutaj jest ciekawa dyskusja: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/307d658a-f677-40f2-bdef-e6352b0bfe9e/ Rozumiem ten wątek, że uwalnianie małych alokacji nie jest odzwierciedlane w prywatnych bajtach lub zestawie roboczym.

Krótka historia:

If I call

p=malloc(1000);
free(p);

Wtedy prywatne bajty odzwierciedlają tylko alokację, a nie dealokację.

If I call

p=malloc(>512k);
free(p);

Wtedy prywatne bajty poprawnie odzwierciedlają alokacji i dealokacji.

 5
Author: mcanti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-28 08:39:55