2009-06-01 4 views
26

Welchen maximalen Speicher kann der Garbage Collector für einen .NET-Prozess reservieren? Wenn ich auf x64 kompiliere, gibt Process.GetCurrentProcess.MaxWorkingSet ungefähr 1,4GB zurück, aber wenn ich zu AnyCPU (x64) kompiliere, wird die gleiche Zahl zurückgegeben. Für x64 sollte es eher wie der "Limit" -Wert sein, der im Task-Manager angezeigt wird. Wie kann ich die richtige Nummer erhalten, die OutOfMemory-Exceptions verursacht, wenn sie in allen Fällen überschritten werden?Maximaler Speicher, den ein .NET-Prozess zuweisen kann

einige Beispiele, was die Methode zurückgeben soll:

1) Maschinenkonfiguration: x64-Windows 4 GB physischer Speicher, 4 GB Auslagerungsdatei
-wie 64-Bit-Prozess: 8GB
-wie 32-Bit-Prozess : x64-Windows 1 GB physischer Speicher, 2 GB Auslagerungsdatei
-wie 64-Bit-Prozess:

2) Maschinenkonfiguration 1.4GB 3GB
-wie 32-Bit-Prozess: 1.4GB

3) Maschinenkonfiguration: x32-Windows 4 GB physischen Speicher, 4 GB Auslagerungsdatei
-wie 64-Bit-Prozess: Wird nicht passieren
-wie 32-Bit-Prozess: 1.4GB

4) Maschinen-Konfiguration: x32-Windows 512 MB physischen Speicher, 512 MB Auslagerungsdatei
-wie 64-Bit-Prozess: Wird nicht passieren
-wie 32-Bit-Prozess: 1.0GB

+0

Hier ist ein interessanter Artikel über theoretische Höchstwerte und Bereiche, in denen ein .NET-Prozess mit Ausnahmen wegen Speichermangel beginnt: http://blogs.msdn.com/b/ tom/archive/2008/04/10/chat-question-memory-limits-für-32-bit-und-64-bit-prozesse.aspx –

Antwort

3

Ist es nicht davon ab, wie viel RAM Sie haben ?

Theoretisch kann ein x64-Prozess EBs (etabites?) Von RAM, denke ich - dh eine Menge. Aber wenn Sie das tun, sollte Ihre Maschine wie verrückt blättern und in der Regel sterben.

Es war anders im 32-Bit-Modus, wie Sie nicht mehr als 1 GB RAM in jedem Prozess in Windows zuweisen konnten (ja, es gibt Möglichkeiten, aber es ist nicht schön). In der Praxis, diese Maßnahme etwa 7-800meg pro .NET-Prozess, als .NET etwas Platz reserviert.

Wie auch immer, in 32 Bit ist das Maximum, das Sie verwenden können, 3 GB - das Betriebssystem reserviert 1 GB virtuellen Speicherplatz für sich.

In 64 Bit sollte es 2^64, die eine große Zahl ist, aber http://en.wikipedia.org/wiki/X86-64 sagt, es ist 256 TB virtuellen Speicherplatz und 1 TB von REAL RAM. So oder so, es ist viel mehr als Sie wahrscheinlich in Ihrem Computer haben, so wird es die Auslagerungsdatei schlagen.

Mit einem 64-Bit-Betriebssystem und einer 64-Bit-Laufzeit, .NET 2.0-basierte Anwendungen können jetzt 500 Mal mehr Speicher für Daten wie serverbasierten Caches verwenden.

Dieses einige gute Infos hat auch http://www.theserverside.net/tt/articles/showarticle.tss?id=NET2BMNov64Bit

BTW, wenn Sie auf einem x64-Maschine sind (dh x64 Maschine + x64 OS), für AnyCPU und x64 kompilieren tut dasselbe - es läuft in x64-Modus. Der einzige Unterschied ist, wenn Sie verwenden AnyCPU vrs x86:

  • x64 OS/.NET, AnyCPU: x64 App
  • x64 OS /.NET, x64: x64 App
  • x64 OS/.NET, x32: x32-App (x64 .NET Framework als BEIDE x32 und x64-Versionen des Fx installiert)

  • x32 OS/NET, AnyCPU: x32 App

  • x32 OS/.NET, X 64: CRASH UND BURN BABY! (eigentlich stirbt es nur graziös)
  • x32 OS/.NET, x32: x32 app.
+0

Aber wie kann ich das wahre Speicherlimit für eine Maschine bekommen? – Rauhotz

+0

Ich flagge deine Antwort als schlecht, weil du alles gemischt hast. Der 3 GB Speicher ist der maximale freie physische Speicher, in dem 1 oder mehr Prozesse stattfinden können. Jeder Prozess kann auf den vollen 4 Gigs Speicherplatz (32 Bit Adressierung) zugreifen, der Speicher, der nicht im physischen Speicher sein könnte, wird zwischengespeichert (wenn der Cache richtig eingerichtet ist). Und 3 Gigs sind auch nicht ganz richtig. Sie müssen XP einstellen, standardmäßig sind es nur 2 Gigs Ram maximal für App und 2 Gigs für das Betriebssystem (physischer Speicher). –

+2

Tut mir leid, Eric, aber Sie müssen darüber nachlesen, und tatsächlich versuchen es. Das theoretische Limit für ein 32bit System kann 4GB betragen, aber Windows beschränkt Sie auf 3GB (das andere GB wird für das System verwendet, und Sie müssen/3GB in den Bootparametern verwenden, um das zu bekommen) und während jeder Prozess a hat 4 GB Speicherplatz, Windows oder .NET FX erzwingen ein 1-GB-Limit für Prozesse, die keine speziellen Dinge tun (SQL und Exchange tun). –

17

Windows kann so konfiguriert werden, dass bei Bedarf mehr Seitenspeicherplatz zugewiesen wird, oder on request.
Job objects kann den Verbrauch von mehr als einer bestimmten Menge an Speicher verhindern.
Fragmentation des Haufens und die Generationen Natur davon (plus die Notwendigkeit, große Sachen in dem Large Object Heap zu setzen)

All dies bedeutet, dass die harte Grenze nicht viel in Wirklichkeit ist und bedeutet, die Frage zu beantworten, „wie viel Speicher könnte ich theoretisch zuordnen "ist eher komplexer als Sie denken.

Da es sich um komplex jemand fragen diese Frage wohl etwas falsch versucht, zu tun und sollte ihre Frage zu etwas nützlich umleiten.

Was versuchen Sie, eine solche Frage zu benötigen?

„Ich möchte nur wissen, wenn die aktuelle Speicherauslastung des Prozesses problematisch bekommen kann so kann ich Maßnahmen ergreifen, wie einige Elemente eines benutzerdefinierten Cache zu befreien.“

Richtig. Das ist viel leichter zu beantworten.

Zwei Lösungen, um der Komplexität:

  1. Machen Sie Ihre Caches verwenden WeakReferences
    • Das bedeutet, dass sich die Dinge für Sie durch das System fast magische Weise befreit werden, aber Sie werden wie wenig Kontrolle über Dinge haben die Ersetzungsrichtlinie
    • dies beruht auf den zwischengespeicherten Daten, die viel größer sind als der Schlüssel und der Overhead einer schwachen Referenz
  2. Registrieren für notification of Garbage Collections
    • Damit können Sie die Kontrolle über die Freigabe von Dingen übernehmen.
    • Sie verlassen sich auf das System mit der entsprechenden maximalen Größe für die GC-Generationen, die eine Weile dauern kann, um in einen stabilen Zustand zu gelangen.

Punkte zu beachten. Ist es wirklich weniger teuer, diesen massiven Cache zu verwalten (auf die Festplatte durch die Geräusche davon zu gehen), als die Daten neu zu berechnen/erneut anzufordern.
Wenn Ihr Cache eine schlechte Lokalität zwischen häufig/nacheinander angeforderten Elementen aufweist, wird viel Aufwand für das Paging von Daten verwendet. Ein kleinerer Cache mit einer effektiv abgestimmten Reltrapement-Richtlinie hat eine gute Chance, wesentlich besser (und mit weniger Auswirkungen auf andere laufende Programme) zu arbeiten.

Als Nebenerscheinung: In .Net kann kein Objekt variabler Größe (Strings, Arrays) aufgrund der Einschränkungen der CLR-Kernstrukturen für die Speicherverwaltung mehr als 2 GB groß sein. (und beide oben genannten Lösungen werden davon profitieren)

+0

Ich möchte nur wissen, wenn die aktuelle Speicherauslastung des Prozesses problematisch werden könnte, damit ich Aktionen wie das Freigeben einiger Elemente eines benutzerdefinierten Cache ausführen kann. Der Wert muss nicht 100% genau sein, nur ein Hinweis für meinen Cache. Ich habe derzeit die Menge an freiem physischem Speicher als Grenze, aber für 32-Bit-Prozesse ist die Barriere niedriger. – Rauhotz

+0

BTW: Guter Punkt mit der dynamischen Seite Dateigröße, ist vermisst, aber im Moment würde ich mit dem aktuellen Limit zufrieden sein. – Rauhotz

+0

Aha - jetzt kommen wir irgendwohin - beantworte jetzt die Antwort – ShuggyCoUk

Verwandte Themen