Zu Ihrer letzten Frage - der Kurzversion: Die Fehlermeldung bezieht sich auf den "festgeschriebenen" virtuellen Adressraum. Wenn Sie sich das Commit Charge-Diagramm in Ihrem zweiten Bildschirm-Schnappschuss ansehen, werden Sie feststellen, dass es tatsächlich am oder sehr nahe am Limit liegt.
Die Größe des Arbeitsspeichers, der "frei", "verfügbar" oder "in Verwendung" ist, spielt keine Rolle. Insbesondere ein Mangel an "verfügbarem" RAM ist absolut nicht der Grund für die Meldung "Wenig Speicher" oder "Nicht genügend Speicher".
Das Commit-Limit entspricht der Gesamtgröße von RAM + Auslagerungsdatei. Wenn ein festgeschriebener Speicher zugewiesen wird, wird dieser sofort mit "Festschreibungsgebühr" berechnet, obwohl er noch nicht tatsächlich verwendet wurde. Dies bedeutet, dass kein RAM- oder PF-Speicherplatz sofort verwendet wird. Der physische Speicherplatz (im RAM oder in der Auslagerungsdatei) wird nur verwendet, wenn tatsächlich auf den Speicher verwiesen wird. Von da an muss es irgendwo sein, bis das Programm es freigibt oder der gesamte Prozess endet.
Beispiel: Angenommen, Sie haben keine Auslagerungsdatei, daher beträgt Ihr Commit-Limit 16 GB (Ihre RAM-Größe). Angenommen, 8 Prozesse versuchen jeweils, VirtualAlloc (MEM_COMMIT) 1 GB zuzuweisen. Ergebnis: Die Commit-Gebühr erhöht sich um 8 GB. Es gibt jedoch keine unmittelbaren Auswirkungen auf den Arbeitsspeicher! Es ist, als ob Sie einen Block Papier im Schreibwarenladen gekauft hätten, aber Sie haben tatsächlich kein Papier bekommen. Jedes Mal, wenn Sie ein neues Blatt benötigen, erscheint eines auf magische Weise. Bis Sie das gesamte Pad verbrauchen (die Größe der zugewiesenen Region).
Angenommen, jeder dieser Prozesse greift tatsächlich nur auf 100 MB von 1 GB zu. Der verwendete RAM wäre nur 800 MB.
Aber da jeder von ihnen könnte all sein 1 GB verweist, hat das Betriebssystem , um sicherzustellen , dass 8 GB RAM + Auslagerungsdatei Raum ... na ja, das RAM nur in dem Fall ohne Auslagerungsdatei ... nur für den Fall zur Verfügung gehalten wird, was geschieht , . Wenn sie zum Papiergeschäft zurückkehren, müssen sie genügend Papier vorrätig haben, um jedem so viele Blätter wie zuvor zu geben.
Dementsprechend muss das Betriebssystem die erfolgreiche Ausführung von VirtualAlloc (MEM_COMMIT) beenden, wenn der aktuell festgeschriebene Betrag das Limit erreicht.
Warum? Da erwartet wird, dass der Prozess das Ergebnis von VirtualAlloc überprüft, um festzustellen, ob es erfolgreich war. Sobald dies geschehen ist und festgestellt wurde, dass die Zuweisung erfolgreich war, hat der Prozess das Recht zu erwarten, dass die nachfolgenden Verweise auf die gesamte festgeschriebene Region erfolgreich sein werden.
Wenn Windows zulässt, dass die Festschreibegebühr den verfügbaren Speicherplatz überschreitet, um diesen Speicherplatz zu realisieren, kann diese Erwartung nicht immer erfüllt werden.
Eine schnelle Problemumgehung besteht darin, die Standardgröße (= anfängliche Größe) Ihrer Auslagerungsdatei zu erhöhen. Anhand der obigen Erklärung sollten Sie erkennen können, warum die Fehlermeldung dadurch vermieden wird , obwohl möglicherweise nie etwas in diese Datei geschrieben wird . Auch hier stellt das Betriebssystem sicher, dass Speicherplatz für die gesamte Festschreibegebühr zur Verfügung steht, falls diese benötigt wird . Wenn Prozesse festgeschriebenen Speicher zuweisen, sagen sie nur: "Hey, Betriebssystem, ich brauche möglicherweise so viel." Das bedeutet nicht, dass sie es tatsächlich benutzen werden, und es bedeutet sicherlich nicht, dass sie es tatsächlich schon benutzt haben.
Weitere Antworten finden Sie hier .
Nun ... warum Sie so viel Commit verwenden, wenn sich Ihre Prozesse nicht zu summieren scheinen, ist eine andere Frage. Zeigen Sie zunächst die Registerkarte Leistung des Task-Managers im Abschnitt Speicher an.