2010-01-12 5 views
15

Ich dachte, dass der maximale Benutzerraum für einen 64-Bit-Prozess 8 TB war, aber ich habe einen kleinen Test gemacht und das Maximum, das ich bekommen konnte, ist 10-11GB..Net Warum kann ich in einem x64-Prozess nicht mehr als 11 GB zugewiesenen Speicher abrufen?

Hinweis: Ich brauche nicht so viel Speicher in einem Prozess, ich will nur aus Neugier warum verstehen.

Hier ist mein Testprogramm:

static void Main(string[] args) 
{ 
    List<byte[]> list = new List<byte[]>(); 

    while (true) 
    { 
     Console.WriteLine("Press any key to allocate 1 more GB"); 
     Console.ReadKey(true); 
     list.Add(new byte[1024 * 1024 * 1024]); 

     Console.WriteLine("Memory size:"); 
     double memoryUsage = Process.GetCurrentProcess().PeakVirtualMemorySize64/(double)(1024 * 1024 * 1024); 
     Console.WriteLine(memoryUsage.ToString("0.00") + " GB"); 
     Console.WriteLine(); 
    } 
} 

EDIT:

das Testprogramm aktualisiert mehr deterministisch zu sein.

Um eine Antwort zu akzeptieren, würde ich gerne wissen, wie der tatsächlich zugewiesene maximale Speicher berechnet wird, wenn 8TB nur theoretisch ist.

+0

Wie viel Speicher hat Ihr System? Vielleicht 12 GB? –

+0

4 GB physischen Speicher unter Vista x64 Ultimate –

+0

Wie groß ist die Auslagerungsdatei? –

Antwort

4

Es ist bis zu 8 TB, nicht 8 TB. Sie können potenziell bis zu 8 TB haben, aber Sie benötigen das passende RAM/Auslagerungsdatei.

+0

Wahrscheinlich füllen Sie Ihren physischen Arbeitsspeicher und eine Auslagerungsdatei auf, bevor eine "OutOfMemoryException" auftritt. –

+0

Ich frage mich, was passiert, wenn RAM vollständig voll ist. Wie wird "neue OutOfMemoryException" ausgelöst? – Earlz

+1

@earlz - Der Speicher zum Auslösen dieser Ausnahme wurde bereits von der Laufzeit zugewiesen. – codekaizen

1

Versuchen einen Chunk Zuteilung (im Gegensatz zu einer Liste von 1MB Brocken gegen):

Dim p As IntPtr = System.Runtime.InteropServices.Marshal.AllocHGlobal(New System.IntPtr(24 * (1024^3))) 

bearbeiten - Ihr Kommentar gegeben, dass Sie nur 4 GB physischen RAM haben, haben Sie wirklich kein Geschäft Zuteilung> ~ 8GB und sogar das drängt es.

bearbeiten -

Um eine Antwort zu akzeptieren, ich möchte wissen, wie die reale maximal zugewiesenen Speicher berechnet wird, wenn 8TB nur theoretisch ist.

Die maximale Größe des RAM ist wahrscheinlich äquivalent zu dem zuordnen kann (Seite Dateigröße - Größe des Alles in RAM außer, dass die nicht oder nicht ausgelagert werden) + (Physical RAM Size - Größe von allem, was nicht gepickt werden kann oder wird, dh das, was benötigt wird, um Ihr System am Laufen zu halten ... Kernel, Treiber, .net-Sachen etc ...)

Natürlich kann die Seitendatei wachsen ...

Früher oder später wird Paging zu/von Festplatte zu viel und Ihr System verlangsamt sich zu einem Crawl und wird unbrauchbar.

lesen Mark Russinovich Blog:

+4

Ja! 640KB sollte für alle genug sein –

+0

@Terry - Way overused ... nicht einmal witzig ... ~ Im Ernst, wenn Sie versuchen, über doppelt so viel physischen RAM auf einer Windows-Maschine zuzuteilen, überdenken Sie besser Ihre Allokationsstrategie. Verwenden Sie Speicherabbilddateien usw. –

1

Ich vermute, seine weil Sie eine Liste verwenden, die ich hat eine interne Grenze glauben .

Sehen Sie, was Sie bekommen, wenn Sie etwas versuchen, wie Sie Ihre eigenen alten Schule Liste erstellen:

public class ListItem<T> 
{ 
    public ListItem Parent; 
    public T Value; 

    public ListItem(ListItem<T> parent, T item) 
    { 
     this.Parent = parent; 
     this.Value = item; 
    } 
} 

ich fast geschrieben haben, dass genaue Code vor (nur mein Punkt war ein int) und es auf einer Maschine laufen mit 32 Prozessoren und 128 GB RAM, es immer in der gleichen Größe crapped egal was, und war immer etwas mit Int32.MaxValue, hoffe, dass das hilft.

+4

Eine 'List ' kann bis zu 'Int32.MaxValue/2' Elemente enthalten (da es ein Int32 verwendet, um die Elemente zu indizieren). Aber das OP erreicht 10 GB in Blöcken von 1 MB, so dass er nur etwa 10000 Chunks zuweist ... was weit vom Limit entfernt ist. Außerdem müssen Sie die verknüpfte Liste nicht neu erfinden, da ist bereits eine 'LinkedList ' Klasse im BCL ... –

+0

Danke für einen Verweis auf die LinkedList, ich benutze sie selten, also wusste ich nicht, dass es da war. –

8

Es ist Ihre Maschine.

Ich habe eine x64 mit 8 GB RAM und 12GB Auslagerungsdatei, und ich lief Ihr Programm und es bei 16,23GB gekrönt.

EPILOG: Dann rutschte meine Win7-Installation nach und nach in ein Koma, da kritische Prozesse anscheinend speicherhungrig waren.

EDIT: Wenn Sie verstehen wollen, wie Windows zuordnet (dh Reserven und begeht) Speicher, dies lesen: http://blogs.technet.com/markrussinovich/archive/2008/07/21/3092070.aspx und diese: http://blogs.technet.com/markrussinovich/archive/2008/11/17/3155406.aspx

Da .NET auf Windows setzt den Speicher, es zu bauen verwendet, um zu verwalten Der GC-Heap, die Funktionsweise von Windows, spiegelt sich in der Speicherbelegung in .Net auf niedriger Ebene wider.

+0

'kritische Prozesse waren anscheinend Speicher ausgehungert. ' Ha! Ich würde denken, dass * kritische * Prozesse * genau * die Art von Prozessen wären, die Win7 lieber nicht verhungern würde :) – Seth

+0

Nun, wenn die Erinnerung weg ist, ist es weg! – codekaizen

+0

+1 Whahaha, das hat mich so sehr zum Lachen gebracht –

Verwandte Themen