WinCE SQL App memory leak, Speicherproblem
-
Hallo zusammen,
folgendes Problem,
habe mir eine Applikation für WinMobile geschrieben die auf meinen MS SQLServer zugreift und daten austauscht. nun habe ich vor kurzen von .Net2.0 auf 3.5 gewechselt und auf einmal ist der Speicherbedarf(RAM) deutlich gestiegen bzw er steigt im laufe der Zeit immer weiter. dies passiert vor allem bei den routinen für den datenabgleich. leider konnte ich den fehler vorher( mit CompactFramework 2.0) nicht feststellen, soll aber nicht heißen dass dieser da nicht schon da war - vielleicht nur in geringerem maße. Problematisch wirds dann wenn der RAM zur neige geht weil dann die Performance der App komplett in die knie geht. Dabei dachte ich dass der GC das managen würde.
ich habe versucht nur mit SQLDataReader,SQLCommand und SQLConnection auszukommen. Nun meine Frage: Gibt es möglichkeiten den Code dahin gehend zu optimieren, dass er mir bei engpässen den GC anschmeißt.
Möchte meinen kompletten quellcode ungern posten, da es doch relativ viel ist.
gibt es vielleicht auch möglichkeiten speichersparender zu schreiben? dachte an sowas wie static. oder kann es vielleicht sein dass ich bei permanenten Übergaben von string arrays den Stack immer weiter aufblähe?
dazu dann noch die frage ob man mitvoid myfunc(ref string[] abc)
statt
void myfunc(string[] abc)
verhindern könnte? da er so das array ja im speicher nich neu belegen muss!?
Ich bin für jeden Hinweis dankbar.
MfG metaljack
-
* rufst du Dispose()/using auf bei Objekten die IDisposable implementieren?
* werden die nicht mehr benötigten Objekte noch von anderen referenziert?
-
Das sollte kein Problem sein, Arrays werden ja nicht als Parameter neu angelegt sondertn nur verwiesen. Wenn ich mal blind in Wald raten soll: Es fehlen einige using-Direktiven.
Wenn du die Funktion nicht in einer nicht mehr benennbaren Größenordung verschachtelt aufrufst solte es eigentllich kein Problem sein.
Static bringt IFAIK nur was bei der Ausführungszeit nicht bei dem Speicherverbrauch.
-
erstmal besten dank für die schnellen Antworten.
habe jetzt herausgefunden dass das eigentliche Speicherproblem die lokale sqlconnection war. allerdings zeigt sich der speicherverbrauch nicht im eigenen programm sondern durch den sqlce server, da dieser wahrscheinlich alle befehle mitgeloggt hat um einen evtl "Rollback" ausführen zu können. Da ich es versäumt habe die lokale verbindung immer wieder zu trennen hat der mit jedem update der Datenbank immer mehr speicher belegt und somit mein programm zum erliegen gebracht, da dort mit "DELETE FROM <table>" ne menge zu merken war.
kurz und knapp: nach jedem abgeschlossenen vorgang localsql_disconnect() und dann erst wieder localsql_connect() scheint die lösung zu sein.
@Rhombicosidodecahedron: rein interesse halber. Wie meinst du das es fehlen vielleicht using-direktiven? bzw kannst du mir erläutern inwiefern mehr eingebundene using-direktiven dazu beitragen, den speicher des programms besser zu verwalten?
-
Schau mal hier das sollte helfen.
-
ahhh. I see.
damit kann man bestimmt ne menge zeilen sparen.
auf jeden fall gut zu wissen.Besten Dank für den Hinweis.
-
Hehe geht nicht vorangig um Zeilen sparen, sondern darum das man verhindern möchte das der Entwickler mal ausversehen ein Close/Dispose vergisst