Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Problem mit Speicherverbrauch bei mehrfachem Aufruf einer Methode (P/Invoke)
B A L U
myCSharp.de - Member

Avatar #avatar-2327.gif


Dabei seit:
Beiträge: 134

Themenstarter:

Problem mit Speicherverbrauch bei mehrfachem Aufruf einer Methode (P/Invoke)

beantworten | zitieren | melden

Hallo.

Ich benutze folgende Methoden, um alle Prozesse zu ermitteln, die einen Datei blockieren. Bei mehrfachem Aufruf der Methode steigt mein Speicherverbrauch ins unermessliche, und die Dauer für die Ausführung des Scripts steigt von 5 Sekunden auf 2 Minuten.

Gibt es darin irgendwo ein Memory Leak? Mir ist erstmal keiner aufgefallen. Gibt es irgendeine Möglichkeit, herauszufinden welcher Teil so viel Speicher benötigt?

Vielen Dank im Voraus

B A L U

Edit: Code zwecks Unübersichlichkeit entfernt...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von B A L U am .
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.814
Herkunft: Waidring

beantworten | zitieren | melden

Hallo,
Zitat
Gibt es irgendeine Möglichkeit, herauszufinden welcher Teil so viel Speicher benötigt?
Profiler nennen sich diese Teile.

Hast du beim allem was IDisposable implementiert auch Dispose aufgerufen bzw. in einen using-Block gepackt. Sind alle Handles freigegeben?

Aber es ist wirklich dein Ernst zu glauben dass sich jemand durch deinen Code wurstet? Bitte beachte auch [Hinweis] Wie poste ich richtig? Punkt 4.c, 4.a!


mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
B A L U
myCSharp.de - Member

Avatar #avatar-2327.gif


Dabei seit:
Beiträge: 134

Themenstarter:

beantworten | zitieren | melden

Sorry für den ewig langen Code. Habe erst nach dem Absenden bemerkt, wieviel das eigentlich ist. Tut mir Leid.

Das mit dem Handels freigeben werde ich mal überprüfen.
private Nachricht | Beiträge des Benutzers
Floste
myCSharp.de - Member

Avatar #avatar-2376.jpg


Dabei seit:
Beiträge: 1.130
Herkunft: Norddeutschland

beantworten | zitieren | melden


1.) Es fehlt einmal Marshal.FreeHGlobal(ipHandlePointer); vor dem return
2.) RtlFreeUnicodeString
3.) Auf DuplicateHandle muss immer CloseHandle folegen, genauso auf OpenProcess

Tipp: Wenn du die Handles durchgehst, dann kannst du die Dateihandles bereits von anderen unterscheiden: ObjectTypeNumber
Um an die richtige Konstante zu gelangen musst allerdings ersmal ein Dateihandle gefunden haben. Du kannst dazu entweder eine datei selber öffnen (FileStream.Handle) und das handle in der Liste suchen, oder dir beim ersten Fund eines Dateihandles die Id merken. Das Spart enorm Aufrufe von DuplicateHandle.

Außerdem finde ich es mit dem Marshal deutlich unübersichtlicher als mit unsafe Pointern.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Floste am .
Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!
private Nachricht | Beiträge des Benutzers
user8744
myCSharp.de - Member



Dabei seit:
Beiträge: 1.150

beantworten | zitieren | melden

Ja es ist wirklich zuviel Code. Floste hat ja schon einen guten Hinweis gegeben.
Was ich tun würde ist neben dem Einsatz eines Profilers Codeabschnitte zu entfernen und die Funktion in einer Schleife von mir aus 1000 mal aufzurufen um zu sehen ob der Speicherverbrauch immer noch so ansteigt, wenn nicht den nächsten Abschnitt hinzufügen, wieder 1000 mal usw. Blöd irgendwie aber so kommt man Problemen die im unmanaged Bereich liegen oft gut auf die Spur.
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.104

beantworten | zitieren | melden

Es ist zwar recht lang, aber so wahnsinnig viele Methoden sind es ja gar nicht.
Um der Laufzeit auf die Spur zu kommen würd ich die Methodenaufrufe zählen. Bau Zählvariablen in die Klasse und lass dir am Ende ausgeben was wie oft aufgerufen wurde. Dann kannst du vielleicht noch die Gesamtlaufzeit stoppen usw. und so kommst du dann irgendwann drauf, wo die Zeit verbraten wird.
Vielleicht passt nur irgendwas mit den Schleifen nicht, oder es blockiert sich etwas gegenseitig durch parallele Aufrufe?
Evtl. löst sich die Frage mit dem Speicherverbrauch dann automatisch, wenn du weißt wo das Programm sich lange aufhält und was es da macht.

Die MessageBoxen würd ich rausnehmen, dadurch geht ja schon einiges an Zeit drauf. Lass das lieber in Debug.WriteIrgendwas schreiben, wie das eben genau heißt...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von chilic am .
private Nachricht | Beiträge des Benutzers
B A L U
myCSharp.de - Member

Avatar #avatar-2327.gif


Dabei seit:
Beiträge: 134

Themenstarter:

beantworten | zitieren | melden

Danke für die vielen Anworten. Durch die Tipps von Floste läuft das ganze schon wesentlich performanter. Allerdings habe ich noch eine Frage:

Wo müsste den in der Funktion das RtlFreeUnicodeString eingebaut werden? Ich konnte mein Speicherproblem jetzt auf diese Funktion zurückführen. Wenn ich vor dem Return die Funktion RtlFreeUnicodeString auf objObjectName.Name anwende, erhalte ich eine Accessviolation.

Danke noch mal im Voraus, für eure Zeit.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von B A L U am .

Moderationshinweis von gfoidl (02.06.2011 - 12:01)

Bitte beachte auch [Hinweis] Wie poste ich richtig? Punkt 4.a, 4.c, 4.1
Das Forum ist nicht dazu da deine Code zu debuggen. Genügend Hinweise hast du ja bekommen wie du selbst zur Lösung kommst. Beachte das bitte. Beim nächsten mal ist das Thema geschlossen.

private Nachricht | Beiträge des Benutzers