Autor Beitrag
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Fr 18.07.03 18:43 
Kürzlich musste ich feststellen, dass Windows "Zu wenig Arbeitsspeicher" meldete. Allerdings wurden alle Komponenten meines Programms sauber entfernt (Free). Dann habe ich folgendes Versucht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var a:integer;
begin
 for a:=0 to 1000 do begin
  with TButton.Create(Form1) do begin
   Parent:=Form1;
  end;
 end;
 while ComponentCount>2 do (Components[ComponentCount-1] as TButton).Free;
end;

Startet man das Programm, sieht man im Taskmanager (ab 2000) den verwendeten Speicher. In meinem Fall 1.9 MB. Führt man nun die Routine z.B. mit einem Button aus, so werden 1000 Buttons erzeugt und wieder freigegeben. Trotzdem zeigt der Taskmanager nach dem Aufruf 2.6 MB an. Wie kann man das Ändern?

maxk

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Brueggendiek
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: Sa 19.07.03 04:08 
Hallo maxk!

Wenn Delphi Speicher anfordert, bleibt der normalerweise zugewiesen, auch wenn er leer wird. Außerdem kann man ja nicht wissen, ob da nicht irgendwas noch weiter belegt wurde und mittendrin herumsteht.

Deshalb gibt Delphi den Speicher erst beim Programmende an des System zurück - da kann man gar nichts ändern.

Was übermäßigen Speicherverbrauch betrifft:
mal MemProof drüberlaufen lassen - vielleicht wird ja irgendwie ein Speicherleck erzeugt.

Gruß

Dietmar Brüggendiek
maxk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Sa 19.07.03 09:37 
Was ist MemProf, ist das mit MemMaker vergleichbar oder macht das was ganz anderes?

Nein, Problem ist, dass ich einen Portscanner geschrieben habe. Thread wird erstellt, der Thread verbindet sich, Thread wird zerstört. Da es aber 65535 mögliche Ports gibt, werden auch 65535 Threads erstellt. Obwohl sie freigegeben werden, bleibt der Speicher zugewiesen.

Kann ich nicht beim Zuweisen sagen, dass er Speicher an Adresse A nimmt, wenn ich weiß, dass ich vorher ein Objekt an A freigegeben habe, das sie selbe Länge hatte. Geht das vielleicht mit Pointern (ein Thema mit dem ich mich bisher kaum beschäftigen musste).
Irgendwie muss es ja gehen, sonst würde ja kein Portscanner der Welt auf meinem System laufen...

DfaA,
maxk

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Sa 19.07.03 12:19 
65535 Threads? Welches System soll das verkraften? Win98 steigt glaube ich bei ca. 4000 gleichzeitig geöffneten Ports aus. Win2000 geht zwar um einiges weiter hoch mit der Zahl aber alle Ports auf einmal verkraftet auch ein stabiles Win2000 nicht.

MemProf = Speicherlecksucheprogramm für Delphi.

_________________
Ist Zeit wirklich Geld?
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Sa 19.07.03 13:44 
Au weia, da schreibt jemand ein Stress-Proggi für das Winsock :-) dat kann man och eenfacher machen. Einfach in einer Schleife die möglichen Ports abfuttern. Oje oje.
grez
msch
maxk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Sa 19.07.03 18:53 
AndyB hat folgendes geschrieben:
65535 Threads? Welches System soll das verkraften? Win98 steigt glaube ich bei ca. 4000 gleichzeitig geöffneten Ports aus.
Nein anders, der Scanner erstellt 10 Threads und übergibt ihnen die Ports z.B. 1..10. Dann wartet er, bis es weniger als 10 Threads gibt und erstellt entsprechend neue (mit neuem Port natürlich). Das Problem ist nur, dass die alten Threads nach ihrer Beendigung nicht richtig entfernt werden -> Winblöd meckert über den Arbeitsspeicher, der sich schnellt mit Datenresten füllt. Ansonsten werden immer nur 10 Socketverbindungen aufgebaut.
Aber wie verhindere ich das volllaufen? Ich will unbedingt Threads verwenden, ansonsten dauert der Scan zu lange.

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.