myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » Speichermanagement
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Speichermanagement

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
klaus1 klaus1 ist männlich
myCSharp.de-Mitglied

avatar-1666.gif


Dabei seit: 15.05.2005
Beiträge: 180
Entwicklungsumgebung: Visual Studio .NET 2003
Herkunft: Schörfling a. Attersee


klaus1 ist offline Füge klaus1 Deiner Kontaktliste hinzu

Speichermanagement

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo!

Habe mittlerweile ein ziemlich großes Programm, mit sehr viel Umfang geschrieben, auch mit NationalInstruments Eingabekarte..
Mein Problem: nach ca. 50 Messungen, bzw. Abläufen, wächst der Speicher so stark an, dass ich beim Stoppen von diversen Sachen 100% CPU erreiche, und das System für 5 sec. auf 100% läuft, erst dann lässt sich das ganze wieder steuern.

Wie kann ich Speicher wieder freigeben? Insbesondere ab 50 000k im Taskmanager wirds kritisch!

Meine Frage: Kann ich im Visual Studio irgendwie erstellte Objekte (mit new) die ich nicht mehr benötige per Hand freigeben, insbesondere statt auf den Garbage Collector zu warten, der ja zugreift wie’s grad reinpasst!
Hab was gefunden mit .Dispose(), allerdings kann ich das nur bei manchen Variablen verwenden.

Wichtig wäre das Auffinden von nicht mehr benötigten Variablen!
LG, Klaus

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von klaus1 am 02.08.2005 10:00.

Neuer Beitrag 02.08.2005 07:23 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
norman_timo norman_timo ist männlich
myCSharp.de-Mitglied

avatar-1775.jpeg


Dabei seit: 13.07.2004
Beiträge: 4.506
Entwicklungsumgebung: .NET 2.0/3.5 und VS2005/VS2008
Herkunft: Wald-Michelbach (Odw)


norman_timo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo klaus1!

Herzlichen Glückwunsch!

Du hast eben eine große Schwachstelle von .NET entdeckt :-)

Es ist überhaupt nicht möglich nicht mehr zu brauchende Objekte zerstören zu lassen, das macht ausschließlich der Garbage Collector! Auch .Dispose() bewirkt keine direkte Zerstörung, sondern nur eine direkte Markierung "zum zerstören freigegeben".

Eine Möglichkeit zur Beschleunigung von Zerstören der Objekte gibt es:

die Referenz auf Objekte auf null setzen, und danach GC.Collect() aufrufen.

Das soll angeblich den Müll forciert aufräumen, doch auch darauf ist kein 100%iger Verlass!

Aber besser geht´s nicht!

Deshalb ist auch in den heutigen Zeiten von Arbeitsspeicherüberfluß noch eine Speicherminimale Programmierung vonnöten. Also nur das in Anspruch nehmen, was zwingend notwendig (vielleicht öfter mit Singleton-Pattern, oder gleich nach der Benutzung wieder die referenz löschen...)

Ciao
Norman-Timo

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von norman_timo am 02.08.2005 11:07.

Neuer Beitrag 02.08.2005 11:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
kl1mm kl1mm ist männlich
myCSharp.de-Mitglied

Dabei seit: 10.03.2005
Beiträge: 35
Entwicklungsumgebung: Visual Studio C#2005 Express
Herkunft: Hamburg


kl1mm ist offline MSN-Passport-Profil von kl1mm anzeigen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,

dumme zwischen Frage: Ist da für .Net 2.0 Besserung in Sicht?

mfg Kl1mm
Neuer Beitrag 02.08.2005 11:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
maxE maxE ist männlich
myCSharp.de-Mitglied

Dabei seit: 27.04.2004
Beiträge: 456
Entwicklungsumgebung: SharpDevelop
Herkunft: Sachsen


maxE ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Für mich hört sich das eher nach "unschön programmiert" an. Wenn der Speicher so stark anwächst und du 100% CPU Auslastung hast, dann machst du irgendwas verkehrt. (Du liest doch nur Messwerte aus, oder?)
Neuer Beitrag 02.08.2005 12:19 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
VizOne VizOne ist männlich
myCSharp.de-Mitglied

avatar-1563.gif


Dabei seit: 26.05.2004
Beiträge: 1.373
Entwicklungsumgebung: VS 2010


VizOne ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Da schließe ich mich maxE an. Bei "ordentlicher" Programmierung ist der GC kaum zu spüren.

Zunächst solltest du einmal feststellen, ob es überhaupt der GC ist, der die Auslastung verursacht. Hilfreiche Tools hierfür sind der  CLR Profiler 2.0 sowie die Leistungskonsole (Systemsteuerung->Verwaltun->Leistung). Bei ersterem kannst du u.a. sehen, wann der GC aktiviert wird, wieviel Speicher womit gefüllt ist und wie lange welche Methode benötigt. Bei der Leistungskonsole kannst du verschiedene Indikatoren testen, z.B. die Anzahl der Collections (dümmlicherweise mit "Auflistungsanzahl der Generation 0/1/2" bezeichnet) oder die GC-Zeitdauer in Prozent. Beide Indikatoren findest du beim Datenobjekt .NET CLR Speicher.

Als eine "große Schwachtstelle von .NET" würde ich persönlich den GC nicht bezeichnen. Wie gesagt, richtig programmiert ergeben sich durch ihn keine wirklichen Nachteile. Im Gegenteil: die Speicherverwaltung von .NET beitet diverse Vorteile - u.a. weniger Leaks und schnellere Heapallokationen.

Dispose() markiert übrigens ein Objekt nicht als "bereit zum freigeben". Dispose() ist in der Regel so implementiert, dass nicht-verwaltete Resourcen (z.B. offene Dateien, nicht-verwalteter Speicher) direkt oder indirekt freigegeben werden. Bei Objekten, die einen Finalizer implementieren ruft Dispose i.d.R. den Aufräumcode direkt auf und veranlasst den GC, den Finalizer nicht mehr aufzurufen, was eine schnellere Freigabe des Objekts ermöglicht. Stichwort: Dispose-Pattern.


MfG VizOne
Neuer Beitrag 02.08.2005 13:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Fabian Fabian ist männlich
myCSharp.de-Mitglied

avatar-1590.jpg


Dabei seit: 09.12.2004
Beiträge: 1.985
Entwicklungsumgebung: Visual Studio 2010
Herkunft: Dortmund


Fabian ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

wo wir jetzt schon bei der Sache sind, habe ich noch eine Frage dazu. Habt ihr mal ein Beispiel für "richtig programmieren", was die Speicherauslastung anbelangt? Das man nicht in einer Schleiffe n Objekte mit new neu anlegen sollte, sondern, sofern es möglich ist, die Daten eines Objektes ständig ändert, ist eigentlich klar, aber wie sollte man sonst vorgehen?

Ist es zum Beispiel sinnvoll, dass so zu machen?

C#-Code:
Class myClass = new Class();

// Nette Sachen mit dem Objekt machen.
// ...

// Und zum Schluss Objekt auf null setzen.
myClass = null;

Ist das sinnvoll und/oder habt ihr evtl. noch mehr hilfreiche Tipps?


Gruß,
Fabian
Neuer Beitrag 02.08.2005 13:50 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
VizOne VizOne ist männlich
myCSharp.de-Mitglied

avatar-1563.gif


Dabei seit: 26.05.2004
Beiträge: 1.373
Entwicklungsumgebung: VS 2010


VizOne ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Für dieses Szenario ist das myClass = null vollkommen sinnlos. Der JITter kann das Objekt bereits viel früher als entfernbar einstufen und myClass = null vollkommen ignorieren. Bei Member- und statischen Variablen sieht es etwas anders aus. Solange das Objekt/der Typ selbst erreichbar ist, sind auch dessen Member erreichbar. Wenn man diese frühzeitig auf null setzt, können sie bereits entfernt werden, während das Elternobjekt noch existiert.

Siehe
 http://blogs.gotdotnet.com/cbrumme/perma...60-f0fa27ab6cc0
 http://msdn.microsoft.com/msdnmag/issues/1100/gci/
 http://msdn.microsoft.com/msdnmag/issues/1200/gci2/



MfG VizOne
Neuer Beitrag 02.08.2005 14:23 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Fabian Fabian ist männlich
myCSharp.de-Mitglied

avatar-1590.jpg


Dabei seit: 09.12.2004
Beiträge: 1.985
Entwicklungsumgebung: Visual Studio 2010
Herkunft: Dortmund


Fabian ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo VizOne,

vielen Dank für die Erklärungen und die Links.


Gruß,
Fabian
Neuer Beitrag 02.08.2005 14:28 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 2 Monate.
klaus1 klaus1 ist männlich
myCSharp.de-Mitglied

avatar-1666.gif


Dabei seit: 15.05.2005
Beiträge: 180
Entwicklungsumgebung: Visual Studio .NET 2003
Herkunft: Schörfling a. Attersee

Themenstarter Thema begonnen von klaus1

klaus1 ist offline Füge klaus1 Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Habe folgendes Problem, dass ich ziemlich oft während meiner Messung, und einlesen der Messdaten, sehr viele Threads starte und stoppe!

Ich denke mein Problem liegt am stoppen der Threads!
Ich verlasse nur die große while schleife im Thread! der Compiler im Debug modus schreibt zwar: Thread beendet, aber gibt er auch wirklich speicher frei?
muss ich mich darum selber kümmern?
Bitte um Hilfe!
LG, Klaus
Neuer Beitrag 22.10.2005 09:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 15 Jahre.
Der letzte Beitrag ist älter als 14 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 23.09.2020 02:50