![]() |
Speicher wird nicht freigegeben
Hi,
Ich bin gerade etwas am verzweifeln. Da lobe ich mir doch die Sprachen, in denen man selbst sichergehen muss/darf dass nicht mehr gebrauchter Speicher brav freigegeben wird. Der Garbage Collector von C# schafft das scheinbar nicht... Habe eine Klasse (ServerSocket), die folgende Variable besitzt:
Code:
ClientConnection ist dabei eine von mir erstellte Klasse.
public List<ClientConnection> Clients = new List<ClientConnection>();
Nachdem sich ein Client mit dem Server verbunden hat, wird dieser zu dieser Liste hinzugefügt
Code:
In dieser Klasse findet dann die Kommunikation mit dem Client statt. Wenn der Client die Verbindung beendet wird ClientDisconnect aufgerufen:
Clients.Add(new ClienConnection(e)); // e = SocketAsyncEventArgs... ist aber nicht so wichtig
Clients[Clients.Count-1].OnDisconnect += ClientDisconnect;
Code:
Das Objekt selbst führt keine weiteren Methoden aus. (Ich müsste mich stark irren, falls doch)
private void ClientDisconnect(object sender, SocketAsyncEventArgs e)
{ Clients.Remove(sender as ClientConnection); Console.WriteLine("Client Disconnected"); } Aber der Speicherplatz für das ClientConnection Objekt wird nicht freigegeben. Es gibt meines Wissens keine weiteren Referenzen auf dieses Objekt, bis auf die in der Clients-Liste. Bin gerade etwas ratlos :gruebel: Gruß Neutral General |
Re: Speicher wird nicht freigegeben
Und wie misst du, ob die Instanz freigegeben wurde?
Übrigens, die Klasse enthält doch sicher andere Klassen, die IDisposable implementieren. Dann musst du das Interface ebenfalls implementieren (und beim Disconnet Dispose auch aufrufen), damit unmanaged Ressourcen so schnell wie möglich freigegeben werden. |
Re: Speicher wird nicht freigegeben
Hi,
Ich hab es daran gemerkt, dass nachdem 2000 Clients von meinem Server disconnected sind der Speicher nicht geringer wurde. Richtig sicher war ich mir nachdem ich der ClientConnection Klasse ein 5 MB großes Byte Array verpasst hab. 2 Clients verbinden sich: Arbeitsspeicherverbrauch 12 MB 2 Clients leaven: 12MB Hab gerade hier den Code nicht zu Verfügung aber wenn ich mich nicht irre enthält meine Klasse eine Socket Variable und eine SocketAsyncEventArgs Variable. Das mit dem IDisposable Interface funktioniert? Ich glaub da nicht so recht dran... Wie funktioniert das denn in C#? |
Re: Speicher wird nicht freigegeben
Versuch es nochmal mit GC.GetTotalMemory(true), die Angaben dürften verlässlicher sein.
Zitat:
|
Re: Speicher wird nicht freigegeben
Hi,
Kannst du mir evtl erklären wie ich das Interface in meine Klasse einbinde und welchen Namespace ich dafür einbinden muss? |
Re: Speicher wird nicht freigegeben
Zitat:
Zitat:
|
Re: Speicher wird nicht freigegeben
Der GC gibt den Speicher doch eh zu einem Zeitpunkt seiner Wahl frei:
Zitat:
|
Re: Speicher wird nicht freigegeben
Hallo,
probier mal Clients[Clients.Count-1].OnDisconnect -= ClientDisconnect; der Delegate hält auch eine Referenz. mr2 |
Re: Speicher wird nicht freigegeben
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz