Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Speicherfreigabe beim Minimieren (https://www.delphipraxis.net/139205-speicherfreigabe-beim-minimieren.html)

fajac 25. Aug 2009 14:51


Speicherfreigabe beim Minimieren
 
Hallo Gemeinde,

Ich habe folgendes Problem:

Meine Applikation nutzt eine Dritt-Hersteller-Komponente, deren Speicherbedarf seit dem letzten Update stark angewachsen ist. Da meine App auf einem Terminalserver mit vielen Instanzen läuft, ist das ein Problem.
Nun ist unter XP folgendes Phänomen zu beobachten: Wenn eine Applikation minimiert wird, sinkt der Speicherbedarf rapide ab. So auch in diesem Fall. Mehr noch, wenn ich wieder maximiere, ist der Speicherbedarf zwar wieder größer, aber das in erträglichem Ausmass.
Ein bisschen Herumexperimentieren am Entwicklerrechner brachte heraus, dass programmatisches Minimieren mit Application.Minimize und Application.Restore ebenfalls diesen Effekt zeitigt. Wenn man ein WM_SYSCOMMAND(wParam=SC_MINIMIZE) schickt, minimiert sich die App auch, und der Speicher ist frei. Wenn ich die Nachricht aber abfange, um das Minimieren zu verhindern, passiert nichts...

Leider kann ich meine App nicht minimieren, wenn ein Kunde am Terminalserver damit arbeitet. Nun also zur Frage:

Kann man dieses Speicherverhalten irgendwie simulieren? Irgendwie muss Windows der Applikation nach dem Minimieren doch mitteilen, dass sie ihren Speicher aufräumen kann.

Ich hoffe, ich habe mich verständlich ausgedrückt...stehe völlig auf dem Schlauch, hat jemand eine Idee?

Bernhard Geyer 25. Aug 2009 14:53

Re: Speicherfreigabe beim Minimieren
 
Vergiss diese Informationen des Taskmanagers. Falls am TS zu wenig Speicher verfügbar ist wird Windows schon dafür sorgen das entsprechende aktuell nicht verwendet Speicherseiten ausgelagert werden. Beim minimieren schmeiß halt Windows einiges aus dem RAM da vermutlich die App einige Sekunden nicht benötigt wird.

Assertor 25. Aug 2009 15:09

Re: Speicherfreigabe beim Minimieren
 
Hi,

Bernhard hat absolut recht! Um das ganze auch technisch zu untermauern, sprich den Unterschied zwischen tatsächlicher Speichernutzung und dem Working Set zu erklären, hier ein paar Links:

http://support.microsoft.com/default...b;en-us;293215
http://discuss.joelonsoftware.com/de...et.12.321050.8
http://www.codecomments.com/archive3...-7-542375.html

Als Ergebnis wirst Du feststellen, daß Du dieses Verhalten beim Minimieren - das Reduzieren des Working Set - auch per Code lösen kannst, aber dadurch unter Umständen zwar den Speichern "optimierst", aber "signifikant" Performance einbüßt (MS KB).

Gruß Assertor

fajac 26. Aug 2009 08:35

Re: Speicherfreigabe beim Minimieren
 
Vielen Dank für eure Antworten und Anregungen! Ihr habt mir sehr geholfen.

Assertor 26. Aug 2009 17:25

Re: Speicherfreigabe beim Minimieren
 
Hi fajac,

Zitat:

Zitat von fajac
Vielen Dank für eure Antworten und Anregungen! Ihr habt mir sehr geholfen.

Das freut zu hören, ich spreche bestimmt auch für Bernhard, wenn ich sage: Bitte, gerne!

Gruß,
Assertor

:dp:

fajac 1. Sep 2009 15:12

Re: Speicherfreigabe beim Minimieren
 
Ich komme nochmal auf das Thema zurück, weil sich ein neuer Sachverhalt ergeben hat:

Zunächst hatten wir beschlossen, die Sache auf sich beruhen zu lassen und nichts weiter zu tun, wie die in diesem Thread genannten Links es nahelegen. Nun haben wir allerdings getestet, wie sich unser TerminalServer verhält, wenn sich viele Cients anmelden. Erwartet hätten wir, dass, wenn der Speicher knapp wird, das WorkingSet der anderen Prozesse getrimt wird (wie es Minimize / Restore oder die Api SetProcessWorkingSetSize auch tun), um Speicher für neue Prozesse freizubekommen.
Leider ist das nicht der Fall. Der Rechner fängt statt dessen an, Speicher auszulagern, was die Geschwindigkeit nicht unbeträchtlich verringert :( .

Nun zur Frage: Weiss jemand, ob bzw. wie man einen Rechner dazu "überreden" kann, bei Mangel an freiem Arbeitsspeicher sich zuerst bei anderen Prozessen zu bedienen und erst, wenn das nichts mehr bringt, auszulagern?
Bis ich dazu etwas herausfinde, muss ich mir damit behelfen, die o.g. Api zyklisch aufzurufen, was ja eigentlich nicht empfohlen wird.

Bernhard Geyer 1. Sep 2009 15:16

Re: Speicherfreigabe beim Minimieren
 
Habt ihre einen "echten" TS-Server oder "nur" einen Aufsatz wie Citrix? Falls Citrix: Sind alle Updates eingespielt? Hier gibt es des öftern auch Fehler die sich nach Einspielen einer aktuellen Version in Luft auflösen.

fajac 1. Sep 2009 15:19

Re: Speicherfreigabe beim Minimieren
 
Wir haben einen echten TS...wegen des im Test verwendeten OS muss ich nachfragen.
Das System läuft auf einem ESX-Server, d.h. im Grunde als virtuelle Maschine.

Bernhard Geyer 1. Sep 2009 15:24

Re: Speicherfreigabe beim Minimieren
 
Bekommt das OS vom Virtualisierer u.U. mehr Speicher "mitgeteilt" als physikalisch vorhanden und der Virtualisierer fängt das Swappen an :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:18 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