Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Arbeitsspeicher läuft über - wie leeren (https://www.delphipraxis.net/153885-arbeitsspeicher-laeuft-ueber-wie-leeren.html)

Luckie 19. Aug 2010 14:25

AW: Arbeitsspeicher läuft über - wie leeren
 
Keine Ahnung, was Windows weiß. Jedenfalls steht der Adressraum eines nicht mehr existierenden, also beendenten Prozesses, wieder zur Verfügung. Oder hast du schon mal im Taskmanger belegten Speicher gesehen, der zu keinem Prozess mehr gehört? ;)

Ykcim 19. Aug 2010 14:37

AW: Arbeitsspeicher läuft über - wie leeren
 
@Teekeks
Danke, danke, danke, danke!!!!

Ich habe keine Ahnung, warum das auskommentiert war!

Aber das war die Lösung. Jetzt komme ich nicht mehr über 10MB -
auch nach x-maligen Ausführen!!!!


Nocheinmal DANKE - das Ihr drangeblieben bist!!!

alfold 19. Aug 2010 15:07

AW: Arbeitsspeicher läuft über - wie leeren
 
Zitat:

Zitat von Luckie (Beitrag 1043407)
Zitat:

Zitat von alfold (Beitrag 1043378)
Auch wenn Du Dein Programm beendest,(und es sieht so aus das alles Frei gegeben wird), ist der Speicher noch reserviert!

Das ist barer Unsinn. Wo hast du das her? Wenn der Prozess beendet wird, dann wird der Adressbereich des Prozesses komplett wieder frei gegeben und steht anderen Programmen zur Verfügung. Und es spielt keine Rolle, ob du den von dir reservierten Speicher frei gibst oder nicht. Beim beenden räumt Windows hinter dir auf.

mh... War mir nicht so, das Windows erst den Speicher "richtig" freigibt wenn ein neuer Prozess speicher anfordert!? Sollte also mein Prog nach beenden noch mal gestartet werden, erspart sich Windows ne neue zuordnung von Speicher!? (schnellerer Programmstart) Oder verwechsle ich das jetzt mit was anderem:?

Aber wird nicht immer expliziet darauf hingewiesen, das ich selbst dafür verantwortlich bin, egal ob es ein Record, Objekt oder ein dynamisches Array ist, am Ende dafür zu sorgen, das es auch wieder frei gegeben wird? Dann kann man sich ja am Ende( das aufräumen sparen)
Delphi-Quellcode:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
//freigeben von objekte
//dyn. Arrays
//records usw.
end
und ich stecke da immer so viel Arbeit rein:wink:
gruss alfold

Teekeks 19. Aug 2010 15:19

AW: Arbeitsspeicher läuft über - wie leeren
 
Zitat:

Zitat von Ykcim (Beitrag 1043418)
@Teekeks
Danke, danke, danke, danke!!!!

Ich habe keine Ahnung, warum das auskommentiert war!

Aber das war die Lösung. Jetzt komme ich nicht mehr über 10MB -
auch nach x-maligen Ausführen!!!!


Nocheinmal DANKE - das Ihr drangeblieben bist!!!

Bitte, Bitte.
Gern geschehen :)
Manchmal sieht man den Wald vor lauter Bäumen nicht :)

Luckie 19. Aug 2010 15:48

AW: Arbeitsspeicher läuft über - wie leeren
 
Zitat:

Zitat von alfold (Beitrag 1043422)
mh... War mir nicht so, das Windows erst den Speicher "richtig" freigibt wenn ein neuer Prozess speicher anfordert!? Sollte also mein Prog nach beenden noch mal gestartet werden, erspart sich Windows ne neue zuordnung von Speicher!? (schnellerer Programmstart) Oder verwechsle ich das jetzt mit was anderem:?

Nein. Wird ein Prozess beendet, egal ob regulär oder durch den Taskmanager, wird der Adressraum wieder frei gegeben.

Zitat:

Aber wird nicht immer expliziet darauf hingewiesen, das ich selbst dafür verantwortlich bin, egal ob es ein Record, Objekt oder ein dynamisches Array ist, am Ende dafür zu sorgen, das es auch wieder frei gegeben wird?
Ja bist du, innerhalb des Programmes, also wenn dein Programm noch läuft, sonst müllst du dir den Speicher voll.

Zitat:

Dann kann man sich ja am Ende( das aufräumen sparen)
Könnte man. Ist aber kein sauberer Stil.

xZise 20. Aug 2010 00:20

AW: Arbeitsspeicher läuft über - wie leeren
 
Moin,
Zitat:

Zitat von alfold (Beitrag 1043422)
Zitat:

Zitat von Luckie (Beitrag 1043407)
Zitat:

Zitat von alfold (Beitrag 1043378)
Auch wenn Du Dein Programm beendest,(und es sieht so aus das alles Frei gegeben wird), ist der Speicher noch reserviert!

Das ist barer Unsinn. Wo hast du das her? Wenn der Prozess beendet wird, dann wird der Adressbereich des Prozesses komplett wieder frei gegeben und steht anderen Programmen zur Verfügung. Und es spielt keine Rolle, ob du den von dir reservierten Speicher frei gibst oder nicht. Beim beenden räumt Windows hinter dir auf.

mh... War mir nicht so, das Windows erst den Speicher "richtig" freigibt wenn ein neuer Prozess speicher anfordert!? Sollte also mein Prog nach beenden noch mal gestartet werden, erspart sich Windows ne neue zuordnung von Speicher!? (schnellerer Programmstart) Oder verwechsle ich das jetzt mit was anderem:?[...]

Unwahrscheinlich. Weil wenn ich z.B. Notepad beende und dann eine neue Instanz starte, mache ich ja da nicht wieder weiter. Und um herauszufinden, welche Daten weiter genutzt werden könnten, ist eh alles wieder geladen. Ich glaube du meinst eher den Cache in der Festplatte. Aber da hat da Betriebssystem nur entfernt mit zu tun und im idealfall gar nicht.

Zitat:

Zitat von alfold (Beitrag 1043422)
[...]Aber wird nicht immer expliziet darauf hingewiesen, das ich selbst dafür verantwortlich bin, egal ob es ein Record, Objekt oder ein dynamisches Array ist, am Ende dafür zu sorgen, das es auch wieder frei gegeben wird? Dann kann man sich ja am Ende( das aufräumen sparen)[...]

Kann sein, dass ich mist erzähle, aber normalerweise speichert Windows ab: Der Prozess X hat die virtuelle Adresse V die auf die physikalische Adresse P abgebildet wird. Das heißt, wenn der Prozess X den Wert aus der Adresse V haben will, dann wird die Speicherzelle P aus den RAM oder Swap gelesen.
Nun ist das beim Programmende doch eigentlich so, dass er einfach die Tabelle für den Prozess X verwirft, und die Adresse P nicht mehr benutzt wird. Das da vorher Daten drin waren kann (i.d.R.) egal sein. Notfalls musst du am Anfang den Wert fest definieren.

MfG
Fabian

himitsu 20. Aug 2010 00:42

AW: Arbeitsspeicher läuft über - wie leeren
 
Windows weist dem virtuellen Addressraum des Prozesses reellen Speicher zu, wenn eswas angefordert wird (MSDN-Library durchsuchenVirtualAlloc und Co.)
und beim Beendes des Prozesses werden diese Zuweisungen einfach wieder freigegeben, es sei denn man hat den Speicher ge-shared und andere Prozesse haben auch noch eine Zuweisung ... Windows weiß also was welchem Prozess zugewiesen wurde.

SetLength führt Finalize/FinalizeArray und Initialize/InitializeArray für alle reservierten und freizugebenden Arrayfelder aus.
dynamische Arrays besitzen eine automatischen Speicherverwaltung/Initialisierung (ebenso wie Strings und Interfaces).
Wenn man also bei einem mehrdimensionalen Array das äußere Array freigibt, dann werden über Finalize die untergeordneten Arrays mit freigegeben.


Wärend der Programmlaufzeit muß man sich also "nur" um die nicht automatisch behandelten Speicheranfragen kümmer, wie Pointer und Objekte.

Wird ein Prozess beendet, dann räumt Windows auf ... gerade deswegen wurde ja mit der WinNT-Serie die virtuelle Speicherverwaltung eingeführt.
- Windows weiß wem was gehört und kann damit auch ordentlich aufräumen
- Prozesse haben getrennte Speicherräume und können sich nicht einfach gegenseitig beeinflussen (früher konnte ein BufferOverrun auch schonmal einen fremden Prozess schrotten und nicht nur den Eigenen).

sx2008 20. Aug 2010 02:46

AW: Arbeitsspeicher läuft über - wie leeren
 
Also ich habe jetzt noch Augenschmerzen vom Lesen des Sourcecode von Beitrag #7. :P
Bitte verwende doch eigene Prozeduren und Funktionen - dieser Spaghetticode ist ja nicht zum aushalten.
Auch wenn ein bestimmter Codeabschnitt nur einmal verwendet wird lohnt es sich doch diesen in eine Prozedure oder Funktion (genauer gesagt eine Methode) zu verpacken.

alfold 20. Aug 2010 11:54

AW: Arbeitsspeicher läuft über - wie leeren
 
Jo, soll ja keine grundsatz Diskusion werden:wink:
Zitat:

Zitat von alfold (Beitrag 1043422)
mh... War mir nicht so, das Windows erst den Speicher "richtig" freigibt ..... ?

Ich habe es wahrscheinlich verwechselt mit der Prefetch Funktion von Windows, habt also Nachsicht mit mir:mrgreen:
Alles ander hatte ja @Lucki schon in einem Satz gesagt!:wink:

Sonst hat dieses Thema nichts mehr mit den Topic zu tun!

Gruss alfold

p80286 20. Aug 2010 14:46

AW: Arbeitsspeicher läuft über - wie leeren
 
Noch eine Bemerkung zum Aufräumen.
Ich hab das Gefühl, daß das Windows-Aufräumen etwas langsamer von Statten geht, als wenn Du es selbst machst.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:27 Uhr.
Seite 4 von 4   « Erste     234   

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