Erstens sollte es vermieden werden, große Zeichenketten oder große Arrays gleichzeitig im Speicher zu halten, insbesondere auf Geräten mit begrenztem Speicherplatz wie Telefonen. Verwenden Sie zum Beispiel XmlTextReader, um Xml-Dateien zu parsen. Wenn Sie sie aus dem Netzwerk beziehen, speichern Sie sie auf der Festplatte, usw.
Als nächstes das Problem der Garbage Collection: Die aktuelle Mono GC führt einen konservativen Scan der Thread-Stacks durch, was bedeutet, dass einige Zeiger auf Objekte für die GC immer noch sichtbar sein können, auch wenn sie für den Programmierer gelöscht wurden (wie das Setzen auf null in Ihrem Beispiel). Um die Folgen dieses Verhaltens zu begrenzen, sollten Sie versuchen, große Arrays und Strings in einem separaten Stack-Frame zu allozieren oder anderweitig zu manipulieren. Zum Beispiel, anstatt es so zu kodieren:
while (true) {
string s = get_big_string_from_network ();
do_something_with_string(s);
handle_ui ();
s = null;
}
tun Sie Folgendes:
void manipulate_big_string() {
string s = get_big_string_from_network ();
do_something_with_string(s);
}
...
while (true) {
manipulate_big_string ();
handle_ui ();
}
Normalerweise hat das Setzen eines Verweises auf null nur dann die beabsichtigte Wirkung, wenn es auf ein statisches oder Instanzfeld angewendet wird. Die Verwendung mit einer lokalen Variablen einer Methode reicht möglicherweise nicht aus, um den Verweis vor der GC zu verbergen.