Próbuję użyć narzędzia systemu Windows perfmon do debugowania wycieków pamięci w procesie.
Oto jak perfmon wyjaśnia terminy:
Zestaw roboczy to bieżący rozmiar zestawu roboczego tego procesu (w bajtach). Zestaw roboczy to zestaw stron pamięci dotkniętych ostatnio przez wątki w tym procesie. Jeśli ilość wolnej pamięci w komputerze przekroczy próg, strony pozostaną w zestawie roboczym procesu, nawet jeśli nie są używane. Gdy ilość wolnej pamięci spadnie poniżej progu, strony są przycinane z zestawów roboczych. Jeśli będą potrzebne, zostaną z powodzeniem przywrócone do zestawu roboczego przed opuszczeniem pamięci głównej.
Wirtualne bajty to bieżący rozmiar w bajtach wirtualnej przestrzeni adresowej, z której korzysta proces. Wykorzystanie wirtualnej przestrzeni adresowej niekoniecznie oznacza odpowiednie użycie stron dysku lub pamięci głównej. Przestrzeń wirtualna jest skończona, a proces może ograniczyć jej zdolność do ładowania bibliotek.
Prywatne bajty to bieżący rozmiar w bajtach pamięci przydzielonej przez ten proces, który nie może być współużytkowany z innymi procesami.
Oto pytania, które mam:
Czy to prywatne bajty, które powinienem zmierzyć, aby upewnić się, czy w procesie występują wycieki, ponieważ nie obejmują one żadnych bibliotek współdzielonych, a wszelkie wycieki, jeśli się zdarzyły, pochodzą z samego procesu?
Jaka jest całkowita pamięć zużywana przez proces? Czy to wirtualne bajty czy suma wirtualnych bajtów i zestawu roboczego?
Czy istnieje jakikolwiek związek między prywatnymi bajtami, zestawem roboczym i wirtualnymi bajtami?
Czy są jakieś inne narzędzia, które lepiej obrazują wykorzystanie pamięci?
Odpowiedzi:
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 plik wykonywalny i żadna z nich nie jest odpowiednia do debugowania wycieku pamięci.
Bajty prywatne odnoszą się do ilości pamięci, że wykonywalny proces został poproszony o - niekoniecznie kwota jest faktycznie użyciu . Są „prywatne”, ponieważ (zwykle) wykluczają pliki mapowane w pamięci (tj. Współdzielone biblioteki DLL). Ale - oto haczyk - niekoniecznie wykluczają pamięć przydzieloną przez te pliki . Nie ma sposobu, aby stwierdzić, czy zmiana w bajtach prywatnych wynikała z samego pliku wykonywalnego, czy z dołączonej biblioteki. Prywatne bajty to nie tylko pamięć fizyczna; mogą być stronicowane na dysk lub na liście stron rezerwowych (tzn. nie są już używane, ale jeszcze nie są stronicowane).
Zestaw roboczy odnosi się do całkowitej pamięci fizycznej (RAM) używanej przez proces. Jednak w przeciwieństwie do bajtów prywatnych, obejmuje to również pliki mapowane w pamięci i różne inne zasoby, więc jest to nawet mniej dokładny pomiar niż bajty prywatne. Jest to ta sama wartość, która jest zgłaszana w „Użycie pamięci” w Menedżerze zadań i była źródłem nieskończonych ilości nieporozumień w ostatnich latach. Pamięć w zestawie roboczym jest „fizyczna” w tym sensie, że można ją rozwiązać bez błędu strony; jednak lista stron rezerwowych jest również nadal fizycznie w pamięci, ale nie jest zgłaszana w zestawie roboczym, i dlatego może się zdarzyć, że „użycie pamięci” nagle spadnie po zminimalizowaniu aplikacji.
Wirtualne bajty to całkowita wirtualna przestrzeń adresowa zajmowana przez cały proces. Przypomina to zestaw roboczy, w tym sensie, że zawiera pliki mapowane w pamięci (współdzielone biblioteki DLL), ale zawiera również dane z listy rezerwowej oraz dane, które zostały już stronicowane i znajdują się gdzieś w pliku stronicowania na dysku. Całkowita liczba bajtów wirtualnych wykorzystywanych przez każdy proces w systemie o dużym obciążeniu doda znacznie więcej pamięci niż faktycznie ma maszyna.
Relacje są więc następujące:
Jest tu kolejny problem; tylko jako współdzielone biblioteki można przydzielić pamięci wewnątrz modułu aplikacji, co prowadzi do potencjalnych fałszywych alarmów podano w swojej aplikacji Private Bytes, Twoja aplikacja może również skończyć przydzielania pamięci wewnątrz wspólnych modułów, co prowadzi do fałszywych negatywów . Oznacza to, że w rzeczywistości aplikacja może mieć wyciek pamięci, który nigdy nie objawia się w prywatnych bajtach. Mało prawdopodobne, ale możliwe.
Prywatne bajty są rozsądnym przybliżeniem ilości pamięci używanej przez plik wykonywalny i mogą być wykorzystane do zawężenia listy potencjalnych kandydatów na wyciek pamięci; jeśli zauważysz, że liczba ta stale rośnie i rośnie w nieskończoność, warto sprawdzić ten proces pod kątem wycieków. Nie może to jednak udowodnić, że istnieje wyciek lub nie.
Jednym z najbardziej skutecznych narzędzi do wykrywania / korygowania wycieków pamięci w systemie Windows jest w rzeczywistości Visual Studio (link prowadzi do strony dotyczącej używania VS do wycieków pamięci, a nie do strony produktu). Racjonalne oczyszczenie to kolejna możliwość. Microsoft ma również bardziej ogólny dokument dotyczący najlepszych praktyk na ten temat. Istnieje więcej narzędzi wymienionych w poprzednim pytaniu .
Mam nadzieję, że to wyjaśni kilka rzeczy! Śledzenie wycieków pamięci jest jedną z najtrudniejszych rzeczy do zrobienia podczas debugowania. Powodzenia.
źródło
Nie powinieneś próbować używać perfmon, menedżera zadań ani żadnego takiego narzędzia do określania wycieków pamięci. Są dobre do identyfikowania trendów, ale niewiele więcej. Liczby, które zgłaszają w wartościach bezwzględnych, są zbyt niejasne i zagregowane, aby były użyteczne w przypadku konkretnego zadania, takiego jak wykrywanie wycieków pamięci.
Poprzednia odpowiedź na to pytanie doskonale wyjaśniła, jakie są różne typy.
Pytasz o rekomendację narzędzia: Polecam Memory Validator. Może monitorować aplikacje, które dokonują miliardów alokacji pamięci.
http://www.softwareverify.com/cpp/memory/index.html
Oświadczenie: Zaprojektowałem Walidator pamięci.
źródło
Definicja liczników perfmon jest od początku niepoprawna i z jakiegoś powodu wydaje się zbyt trudna do poprawienia.
Dobry przegląd zarządzania pamięcią systemu Windows jest dostępny w filmie „ Mysteries of Memory Management Revealed ” na MSDN: Obejmuje on więcej tematów niż jest to potrzebne do śledzenia wycieków pamięci (np. Zarządzanie zestawem roboczym), ale zawiera wystarczającą ilość szczegółów w odpowiednich tematach.
Aby dać ci wskazówkę dotyczącą problemu z opisami liczników perfmon, oto wewnętrzna historia o bajtach prywatnych z „ Licznika wydajności prywatnych bajtów - Uwaga! ” Na MSDN:
Z „ Planowania wydajności ” w MSDN:
źródło
Tutaj jest ciekawa dyskusja: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/307d658a-f677-40f2-bdef-e6352b0bfe9e/ Rozumiem ten wątek, że zwalnianie małych przydziałów jest nie odzwierciedlone w prywatnych bajtach lub zestawie roboczym.
Krótko mówiąc:
jeśli zadzwonię
wtedy Bajty Prywatne odzwierciedlają tylko przydział, a nie dezalokację.
jeśli zadzwonię
wtedy Bajty Prywatne poprawnie odzwierciedlają przydział i dezalokację.
źródło