Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ShellExecute(Prog) frisst Speicher, wie GarbageCollection ? (https://www.delphipraxis.net/68496-shellexecute-prog-frisst-speicher-wie-garbagecollection.html)

kalmi01 30. Apr 2006 16:15


ShellExecute(Prog) frisst Speicher, wie GarbageCollection ?
 
Moin, moin,

ich habe ein Prog, welches eine (sehr) große Menge an Daten konvertieren muss.
Für die Konvertierung muss ich eine Fremdsoftware per ShellExecute aufrufen.
Bei jedem dieser ShellExecute-Aufrufe gehen meinem System aber rund 20KB Speicher verloren.

Ruft mein Prog ein von mir erstelltes Prog mit ShellExecute auf, sieht alles OK aus,
daran kann es also nicht liegen.

Nach dem ShellExecute steht das fremde Prog im Taskmanager nicht mehr drin.
Ich vermute, es alloziiert Speicher, ohne diesen wieder komplett freizugeben.

Gibt es eine Möglichkeit die GarbageCollection für nicht benötigten Speicher aufzurufen ?
Alternativ wäre es für mich auch OK, wenn ich den ShellExecute so kapseln könnte,
das ich mit meinem eigenen Prog den Speicher wieder freigebe.

Es sind wirklich sehr viel Daten zu wandeln und ich habe keinen Bock,
eine Woche lang im Stunden-Takt den Rechenknecht zu rebooten.

Jede noch so verwegene Idee, meinen Speicher sauber zu halten, ist also sehr willkommen !

Olli 14. Mai 2006 12:50

Re: ShellExecute(Prog) frisst Speicher, wie GarbageCollectio
 
Welches Betriebssystem?

kalmi01 14. Mai 2006 14:53

Re: ShellExecute(Prog) frisst Speicher, wie GarbageCollectio
 
Hallo Olli,

Windows XP + SP2

Olli 14. Mai 2006 15:09

Re: ShellExecute(Prog) frisst Speicher, wie GarbageCollectio
 
Okay, dann dürften die 20kB vom System allozierte Seiten für sowas wie die Prozeßstrukturen (ETHREAD, EPROCESS usw) sein, was aber nach einer Weile aufhören müßte.

Oder meintest du, daß die "Elternanwendung" (also jene die Shellexecute aufruft) immer diese 20kB "verschwendet"?

Auf jeden Fall brauchst du dir keine Sorgen zu machen, wenn Speicher außerhalb deiner Prozesse alloziert oder freigegeben wird. Das beherrscht das System hervorragend und auch recht effizient. Z.T. wird das System einfach Sachen "zurückstellen", damit sie später wiederverwendet werden.

"Globale" Speicherlecks wie in Win16 oder DOS kann es auf NT (XP) nicht geben.

kalmi01 14. Mai 2006 16:17

Re: ShellExecute(Prog) frisst Speicher, wie GarbageCollectio
 
Hallo Olli,
Zitat:

Auf jeden Fall brauchst du dir keine Sorgen zu machen, wenn Speicher außerhalb deiner Prozesse alloziert oder freigegeben wird. Das beherrscht das System hervorragend und auch recht effizient. Z.T. wird das System einfach Sachen "zurückstellen", damit sie später wiederverwendet werden
Tja leider nicht.
Mein Prog ruft die Fremdanwendung auf und wartet auf das Ergebnis, arbeitet es ab.
Soweit so gut.
Wenn ich jetzt einen Moment warte, wird der Speicher wieder freigegeben.
Da ich aber 0,5 Mio. Transaktionen habe, warte ich nicht, sondern verarbeite gleich den Nächsten.
Und dann wird der Speicher nicht wieder freigegeben.
Mein Prog muss also nach ~25000 Transaktionen beenden, weil dann das freie RAM aufgebraucht ist.

jim_raynor 14. Mai 2006 16:40

Re: ShellExecute(Prog) frisst Speicher, wie GarbageCollectio
 
Schonmal mit CreateProcess statt ShellExecute versucht? Oder bist du dir wirklich sicher, dass es von dem ShellExecute kommt?

DGL-luke 14. Mai 2006 16:41

Re: ShellExecute(Prog) frisst Speicher, wie GarbageCollectio
 
dann warte doch nach 10k Transaktionen mal n paar sekunden...

Olli 14. Mai 2006 17:19

Re: ShellExecute(Prog) frisst Speicher, wie GarbageCollectio
 
Zitat:

Zitat von kalmi01
Tja leider nicht.
Mein Prog ruft die Fremdanwendung auf und wartet auf das Ergebnis, arbeitet es ab.
Soweit so gut.
Wenn ich jetzt einen Moment warte, wird der Speicher wieder freigegeben.
Da ich aber 0,5 Mio. Transaktionen habe, warte ich nicht, sondern verarbeite gleich den Nächsten.
Und dann wird der Speicher nicht wieder freigegeben.
Mein Prog muss also nach ~25000 Transaktionen beenden, weil dann das freie RAM aufgebraucht ist.

Selbst wenn es eine MMF benutzen würde, würde die MMF ja wieder freigegeben, wenn alle Handles zu ihr geschlossen werden. Kann die Symptome so nicht nachvollziehen. Bist du sicher, daß die Prozesse wirklich vollständig beendet werden?

Kann es sein, daß du einen Treiber ansprichst und dieser Treiber etwas für dich macht? Vielleicht leckt ja der Treiber?

Zumindest kann ein Prozess, der bereits wieder geschlossen wurde, nicht mehr lecken. Geht einfach nicht, auch wenn die Symptome bei dir anderes vermuten ließen.

kalmi01 14. Mai 2006 17:36

Re: ShellExecute(Prog) frisst Speicher, wie GarbageCollectio
 
Hi,
bei CreateProcess ist da Ergebnis identisch.
Läuft mein Prog ohne den Fremd-Prog-Aufruf, ist der Speicherverbrauch konstant !
Wird das Fremd-Prog mit ShellExecute oder CreateProcess aufgerufen gehen bei jedem Aufruf ca. 20 KB verloren.
Nach x Prog-Aufrufen zu Pausieren bringts auch nicht !
XP scheint den verbrauchten Speicher meinem Prog zuzuordnen.

Hab es so gelöst, dass eine Endlos-Batch mein Prog aufruft, welches dann an letzter Position weiter macht.

Habe statt der Fremd-Anwendung auch schonmal testweise ein eigenes (sauberes) Prog als Aufruf verwendet.
Da war alles OK !
Also der Prog-Aufruf mit ShellExecute kann es nicht sein.

Das Fremd-Prog ist eine reine DOS-Anwendung, die Daten von Format-A nach Format-B wandelt.
Diese Umwandlung kann ich nicht nachprogrammieren, da A ein undokumentiertes Binär-Format ist.

Olli 14. Mai 2006 18:37

Re: ShellExecute(Prog) frisst Speicher, wie GarbageCollectio
 
Das "saubere Programm" war aber vermutlich kein DOS-Programm?

Ich vermute mal fast, daß es sich hier um ein Problem der VDM handelt. Klingt zumindest so.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz