Entwickler-Ecke

Basistechnologien - Programm zur Belasstung des Arbeitsspeichers


will_lernen - Do 02.04.09 18:10
Titel: Programm zur Belasstung des Arbeitsspeichers
Ich soll ein Programm schreiben, dass das Arbeitsspeicher auslasten soll.

Ich habe es versucht mit einem Array der 100 000 000 Plätze lang ist. Damit werden 100 000 000 Plätze im Speicher mit 0 reserviert.


C#-Quelltext
1:
2:
int[] myArray;
myArray = new int [100000000];


mehr geht's nicht.
Meine Frage ist warum es nicht mehr geht?
und wie mache ich das am besten, dass das gesamte Speicher für eine gewiesse Zeit belastet wird?

Danke im Voraus.

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


jaenicke - Do 02.04.09 18:28

Hallo und :welcome: !

Du kannst versuchen immer mehr Arbeitsspeicher zu reservieren, aber den gesamten geht ja nicht, denn ein Teil wird ja auf jeden Fall vom System benötigt. D.h. wenn du neuen anforderst, landet der alte reservierte Speicher schon in der Auslagerungsdatei auf der Festplatte.

Was hat das denn für einen Sinn? Das macht das System extrem langsam, und dann?


will_lernen - Do 02.04.09 22:17

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Hallo und :welcome: !

Du kannst versuchen immer mehr Arbeitsspeicher zu reservieren, aber den gesamten geht ja nicht, denn ein Teil wird ja auf jeden Fall vom System benötigt. D.h. wenn du neuen anforderst, landet der alte reservierte Speicher schon in der Auslagerungsdatei auf der Festplatte.

Was hat das denn für einen Sinn? Das macht das System extrem langsam, und dann?

Es muss auch keinen Sinn haben. Das ist nur zum Testzweck.
Wenn ich das Programm, bzw. dieses Array 16 mal laufen lasse. d.h. die Eingabeaufforderungsfenster ist bei mir 16 mal geöffnet, dann Zeigt der Task Manager volle Belegung.
Ich will das aber in einer Programm machen unf nicht in 16.. )))


Kha - Fr 03.04.09 10:21

user profile iconwill_lernen hat folgendes geschrieben Zum zitierten Posting springen:
Meine Frage ist warum es nicht mehr geht?
"Nicht mehr gehen" heißt wohl, dass du sofort eine OutOfMemoryException bekommst. Du musst den Speicher sukzessive auslasten. Erstelle also immer mehr deiner Monster-Arrays und sammle sie z.B. in einer List<int[]>, bis die Exception kommt. Ohne die Liste würde der Garbage Collector spätestens[*] beim OOM die Arrays aufräumen.

[*]Wen's interessiert: Da die Arrays auf den Large Object Heap kommen, werden sie von einer gewöhnlichen Gen0-Collection nicht erfasst. imo ^^


Delete - Sa 04.04.09 11:46

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Wen's interessiert: Da die Arrays auf den Large Object Heap kommen, werden sie von einer gewöhnlichen Gen0-Collection nicht erfasst. imo ^^


Kannst Du das bitte für mich als Laien übersetzen? Ich bin bei diesem Thema Laie aber interessieren tut es mich schon.


Kha - Sa 04.04.09 12:29

user profile iconNeurologic Scientist hat folgendes geschrieben Zum zitierten Posting springen:
Kannst Du das bitte für mich als Laien übersetzen? Ich bin bei diesem Thema Laie aber interessieren tut es mich schon.
Anscheinend läuft es doch etwas anders ab, als ich in Erinnerung hatte, bevor ich mich also um Kopf und Kragen rede :zwinker: , verweise ich dich einfach auf das Buch, das ich wohl auch mal wieder lesen sollte: CLR via C#. Applied Microsoft .NET Framework 2.0 Programming [http://www.amazon.de/Applied-Microsoft-Framework-Programming-second/dp/0735621632/]. Ein absolute Muss, wenn man ein wenig hinter die Kulissen schauen will :D .

Einen schönen Artikel direkt über den Large Object Heap findest du hier: http://msdn.microsoft.com/en-us/magazine/cc534993.aspx
Objekte > 85KB kommen also auf einen eigenen Heap, aber bei obigen Riesen-Arrays würde wahrscheinlich schon das allererste eine Full Collection hervorrufen. Die Arrays müssten also auf jeden Fall in einer Liste zwischengespeichert werden, sonst sind sie sofort wieder weg.