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:
- Bajty prywatne są tym, co faktycznie przydzieliła twoja aplikacja, ale obejmują użycie pliku strony;
- Zestaw roboczy to niestronicowane prywatne bajty plus pliki mapowane w pamięci;
- Wirtualne bajty to zestaw roboczy plus stronicowane prywatne bajty i lista rezerwowa.
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.