Warum reserviert .net keinen Speicher, wenn ein 2d-Array initialisiert wird?

8
%Vor%

Es scheint so zu sein, dass .Net nach der Ausführung der ersten Zeile tatsächlich keinen Speicher für a reserviert. Nur während es ausgeführt wird, verbraucht der FillValue -Aufruf nach und nach den Speicher. (was etwa 400 MB ist)

Kann mir jemand genauere Informationen dazu geben? Ich dachte, dass a nach der Standardinitialisierung mit 0 gefüllt ist, wie könnte es überhaupt keinen Speicher brauchen?

    
colinfang 23.10.2012, 21:16
quelle

2 Antworten

9

Es gibt zwei Möglichkeiten, Speicher in Windows zu reservieren: "reservieren" und "festschreiben".

Der Task-Manager zeigt nur "Physical Memory Usage History"; Die .NET-VM verwendet anscheinend nur reservierten Speicher, wenn Sie ein Array zuweisen, und geht dann zurück und schreibt die benötigten Teile fest.

Auf diese Weise können Sie Speicher reservieren, ohne ihn tatsächlich aufzunehmen. Dies ist effizienter und reserviert den Speicher gemäß MSDN "reserviert einen Bereich des virtuellen Adressraums des Prozesses, ohne physischen Speicher im Speicher oder im Paging zuzuweisen Datei auf der Festplatte ". Deshalb zeigt Task-Manager es nicht an.

Sie können mehr darüber auf der % co_de lesen % Seite auf MSDN.

Dies ist jedoch ein Implementierungsdetail, also sollten Sie sich nicht darauf oder irgendetwas verlassen. Die Mono-VM zum Beispiel verhält sich wahrscheinlich anders.

    
Seth Carnegie 23.10.2012 21:22
quelle
7

Tatsächlich weist es Speicher zu, wie Sie hier sehen können:

Ссылка

%Vor%

(wird benötigt, um die Größe des Arrays zu verringern, um eine OutOfMemoryException auf ideone zu verhindern)

GC.GetTotalMemory Methode

Ruft die Anzahl der Bytes ab, von denen derzeit angenommen wird, dass sie zugewiesen sind.

    
Tim Schmelter 23.10.2012 21:22
quelle