Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BlueCobold

Community-Fossil

  • »BlueCobold« ist der Autor dieses Themas

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

1

18.07.2010, 10:58

[C#] Speicherverhalten und Code-nachladen

Moin.

Bei einer Untersuchung meiner Programme auf Speicherlecks durch Disposable-Ressourcen (die nicht immer alle von allein freigegeben werden durch Garbage-Collection) habe ich festgestellt, dass nach Ausführung irgendwelchen Codes und durch anschließende Freigabe der dort allozierten Daten nicht wieder der Original-Zustand an Speicher-Auslastung eintritt, der vor der Ausführung gegeben war. Wird Code etwa während der Ausführung von Platte nachgeladen und bleibt dann im Speicher? Wenn ja, kann man in etwa abschätzen, wie groß der Faktor von "Exe auf Platte" und "vollständig geladenem Code" ist? Denn selbst bei kleinen Teilen des Codes, wie ich festgestellt habe, wird ziemlich viel Speicher benötigt. Ich meine... die Exe is 200k, der Speicher ändert sich aber schnell mal um einige MB, nur durch Ausführung von Code.
Oder liegt das rein an der Verwendung statischer Variablen/Konstruktoren, dass der Speicher so wächst. Denn das kann ich mir auch nicht so richtig vorstellen, da ich kaum statische Werte verwende und die meist auch nur winzig (ja, ich weiß, static is evil, aber diese werden nur gelesen und erfüllen durchaus ihren Zweck).

Edit:
Ich habe jetzt mal direkt den Speicher vom Garbage-Collector erfragt.
Vor der Ausführung der Code-Blöcke waren ~450k alloziert. Danach ~520k. Erneute Ausführung bewirkt nichts (ja, doch, so +-15 Bytes). Wo kommen die 70k her? Statische Variablen kann nicht sein, Disposable-Ressourcen werden keine verwendet.

Danke im Voraus
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »BlueCobold« (18.07.2010, 11:13)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

18.07.2010, 12:50

Zwar mögen deine Objekte von dort nichtmehr referenziert sein aber der Garbage Collector räumt nicht ständig auf sondern erst wenn er es als sinnvoll erachtet oder wenn du ihn zwingst indem du GC.Collect() aufrufst.

BlueCobold

Community-Fossil

  • »BlueCobold« ist der Autor dieses Themas

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

18.07.2010, 12:58

Genau das habe ich natürlich in meinem Test getan - ich habe GC.Collect() aufgerufen und bei GC.GetTotalMemory() angegeben, dass er mir die Angabe des Speichers nach vollständiger Collection zurückgeben soll.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

18.07.2010, 13:01

GC.GetTotalMemory() sollte aber eigentlich nur die Größe des Managed Heap zurückgeben und nicht den kompletten Speicherverbrauch inklusive Image und Data Segment etc.
Was für IDisposable Ressourcen sind das denn die da nicht freigegeben werden und warum werden sie nicht Disposed!?

BlueCobold

Community-Fossil

  • »BlueCobold« ist der Autor dieses Themas

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

18.07.2010, 13:06

Wie ich schon sagte, es ist mir aufgefallen, als ich Bugs/Lecks bezüglich IDisposable Ressourcen ausgemerzt habe, die Programm-Codes aus meinem Test enthielten aber keinerlei solcher Ressourcen. Alle Angaben beziehen sich auf Managed Heap.

Die Speicher-Änderung der nicht-Managed-Sachen, sprich die Angaben im Task-Manager sind aber ebenfalls von Interesse (der von mir erwähnte Faktor), da diese sich deutlich ändern, auch wenn der Managed Heap sich nicht ändert.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

18.07.2010, 13:14

Naja, auf das hast du dann jetzt aber eh keinen Einfluss, der Grund dafür wird irgendwo in den Tiefen der CLR zu suchen sein...

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

7

18.07.2010, 14:52

Naja, ich würde da ganz praktisch mal sagen: Wenn dein Speicherverbrauch nicht stetig steigt wärend das Programm ausgeführt wird (evtl zum Testen die relevanten Parts wiederholen) , dann würde ich das ganze nicht beachten.

BlueCobold

Community-Fossil

  • »BlueCobold« ist der Autor dieses Themas

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

18.07.2010, 15:26

Das war ja genau der Grund, warum ich nach Lecks gesucht hatte. Die sind nun weg.

Spannend finde ich das Verhalten aber dennoch.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

18.07.2010, 16:08

Nunja das ist der Preis der Bequemlichkeit. Man gibt in solchen Sprachen halt Kontrolle ab und erhält Komfort. Was da intern genau passiert und wo der Speicher hinverschwindet, kann dir vermutlich keiner auf dieser Welt so wirklich verraten, weil ich glaube kaum, dass es jemanden gibt der bei solchen Umfängen noch genau alles im Kopf hat, was wo und warum passiert.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

BlueCobold

Community-Fossil

  • »BlueCobold« ist der Autor dieses Themas

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

18.07.2010, 16:50

Joar, aber könnte ja sein, dass es da gewisse Profiling Erfahrungen gibt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige