Phoenixz
Lieutenant
- Registriert
- März 2004
- Beiträge
- 595
Hallo,
ich habe eine Verständnisfrage zum Garbage Collector. Warum wird in diesem, zugegebenermaßen künstlich erzeugten Beispiel der Speicher nicht wieder freigegeben?
Wo der erste Code-Block steht ist eigentlich egal. Ich habe ihn einfach mal in den EventHandler eines Buttons einer Windows Forms Anwendung gepackt.
Man kann das ja quasi runterbrechen und behaupten, dass wann immer man mit einer Liste aus Objekten innerhalb einer Methode arbeitet und diese eigentlich nur für interne Zwecke der Methode braucht, wird der Speicher nicht mehr freigegeben?
Generell heißt es eigentlich, dass man den Aufruf von GC.Collect() vermeiden sollte.
Führe ich allerdings
aus, ist der Speicher wieder freigegeben.
Aus einem rein theoretischem Interesse würde ich gerne wissen warum der GC den Speicher nicht von alleine freigibt und wie man, wenn eine solche Liste eine große Menge an Objekten enthält (+1GB) diese am besten wieder freigibt?
Vielen Dank,
Daniel
PS: Es ist übrigens egal ob HashSet oder List.
ich habe eine Verständnisfrage zum Garbage Collector. Warum wird in diesem, zugegebenermaßen künstlich erzeugten Beispiel der Speicher nicht wieder freigegeben?
Code:
private void button1_Click(object sender, EventArgs e)
{
HashSet<Test> tests = new HashSet<Test>();
for (int i = 1; i < 6000; i++) // 6k Einträge erstellen
{
StringBuilder sb = new StringBuilder();
for (int j = 0; j < 1000; j++) // große Einträge erstellen
{
sb.Append("sdfkjasdhfkashd fklajshdf,kjsahdlfkjsahdlfkjhas ldkfjhsaldkf haslkdfbasljkfgbvlahsbclkavbl euvczlsaj,bdhvl,");
}
tests.Add(new Test() { Text = sb.ToString() });
}
tests.Clear();
tests = null;
}
Code:
class Test
{
public string Text { get; set; }
}
Wo der erste Code-Block steht ist eigentlich egal. Ich habe ihn einfach mal in den EventHandler eines Buttons einer Windows Forms Anwendung gepackt.
Man kann das ja quasi runterbrechen und behaupten, dass wann immer man mit einer Liste aus Objekten innerhalb einer Methode arbeitet und diese eigentlich nur für interne Zwecke der Methode braucht, wird der Speicher nicht mehr freigegeben?
Generell heißt es eigentlich, dass man den Aufruf von GC.Collect() vermeiden sollte.
Führe ich allerdings
Code:
...
tests.Clear();
tests = null;
GC.Collect();
}
Aus einem rein theoretischem Interesse würde ich gerne wissen warum der GC den Speicher nicht von alleine freigibt und wie man, wenn eine solche Liste eine große Menge an Objekten enthält (+1GB) diese am besten wieder freigibt?
Vielen Dank,
Daniel
PS: Es ist übrigens egal ob HashSet oder List.