Re twój ostatni Q - krótka wersja: Komunikat o błędzie dotyczy „zatwierdzonej” wirtualnej przestrzeni adresowej. Jeśli spojrzysz na wykres Commit Charge na swojej drugiej migawce ekranu, zobaczysz, że rzeczywiście jest on na granicy lub bardzo bliski.
Ilość pamięci RAM, która jest „wolna”, „dostępna” lub „w użyciu” nie ma znaczenia. W szczególności brak „dostępnej” pamięci RAM absolutnie nie jest przyczyną komunikatu „brak pamięci” lub „brak pamięci”.
Limit zatwierdzeń jest równy całkowitej pamięci RAM + rozmiar pliku strony. Gdy przydzielona pamięć jest przydzielana, jest natychmiast obciążana „ładowaniem zatwierdzenia”, nawet jeśli nie została jeszcze wykorzystana… co oznacza, że nie jest natychmiast używana pamięć RAM lub PF. Przestrzeń fizyczna (czy to w pamięci RAM, czy w pliku stronicowania) jest wykorzystywana tylko wtedy, gdy pamięć jest faktycznie przywoływana. Odtąd musi być gdzieś, dopóki program go nie zwolni lub cały proces się zakończy.
Przykład: Załóżmy, że nie masz pliku stronicowania, dlatego limit zatwierdzeń wynosi 16 GB (rozmiar pamięci RAM). Teraz załóżmy, że każda z 8 procesów próbuje VirtualAlloc (MEM_COMMIT) 1 GB. Wynik: Opłata za zatwierdzenie zostanie zwiększona o 8 GB. Jednak nie ma bezpośredniego wpływu na pamięć RAM! To tak, jakbyś kupił kawałek papieru w sklepie papierniczym, ale tak naprawdę nie dostałeś żadnego papieru. Za każdym razem, gdy potrzebujesz nowego arkusza, pojawia się jeden magicznie. Aż wykorzystasz cały pad (rozmiar przydzielonego regionu).
Załóżmy teraz, że każdy z tych procesów uzyskuje dostęp do 100 MB z 1 GB. Użyta pamięć RAM wynosiłaby tylko 800 MB.
Ale ponieważ każdy z nich może odwoływać się do wszystkich swoich 1 GB, system operacyjny musi zapewnić, że 8 GB pamięci RAM + miejsce na plik stronicowania ... cóż, tylko pamięć RAM w przypadku braku pliku stronicowania ... jest dostępna na wypadek, gdyby tak się stało . Wracając do sklepu z artykułami papierniczymi, muszą mieć na stanie wystarczającą ilość papieru, aby dać każdemu tyle arkuszy, ile wcześniej kupili.
W związku z tym system operacyjny musi przestać pozwalać VirtualAlloc (MEM_COMMIT) odnieść sukces, gdy bieżąca zatwierdzona kwota przekroczy limit.
Czemu? Ponieważ oczekuje się, że proces sprawdzi wynik VirtualAlloc, aby sprawdzić, czy się powiódł. Po dokonaniu tego i stwierdzeniu, że alokacja się powiodła, proces ma pełne prawo oczekiwać, że kolejne odniesienia do całego zaangażowanego regionu powiodą się.
Jeśli system Windows zezwolił, aby opłata zatwierdzenia przekroczyła ilość dostępnego miejsca, aby zrealizować to miejsce, to oczekiwanie nie zawsze mogło zostać spełnione.
Szybkim obejściem jest zwiększenie domyślnego (= początkowego) rozmiaru pliku strony. Z powyższego wyjaśnienia powinieneś zobaczyć, dlaczego to pozwoli uniknąć komunikatu o błędzie, mimo że nic nie może zostać zapisane w tym pliku . Ponownie, system operacyjny zapewnia, że miejsce na całą opłatę za zatwierdzenie jest dostępne w razie potrzeby . Gdy procesy przydzielają przydzieloną pamięć, mówią tylko „hej, OS, może potrzebuję tak bardzo”. To nie znaczy, że faktycznie z niego skorzystają, a to z pewnością nie oznacza, że już go używali.
Aby uzyskać więcej, zobacz moją odpowiedź tutaj .
Teraz .... dlaczego używasz tyle zatwierdzeń, kiedy twoje procesy nie wydają się do tego sumować, to kolejne pytanie. Aby zacząć na to patrzeć, pokaż kartę Wydajność Menedżera zadań, sekcję Pamięć.