| Autor |
Beitrag |
sideruner
      
Beiträge: 41
|
Verfasst: Mi 02.01.08 22:01
Hi leute
Ich hatte vor mir einen internetbrowser zu programmieren aber schon am anfang habe ich festgestellt das beim aufruf einer seite der browser immer mehr arbeitspeicher verbraucht. Wenn ich das programm starte verbraucht es etwa 15kb nach dem ich dann 1-3 ma verscheidene seiten aufgeruft habe ist der verbrauch auf etwa 22kb angestiegen. Um so mehr seiten ich aufrufe, um so mehr Abrbeitspeicher wird verbraucht!
Ich denke mal das der browser die seiten in einer variablen abspeichert. Weiß leider nicht ob das wirklich so ist, ist nur erstmal eine Vermutung.
Ich hoffe ihr könnt mir helfen das ich einstellen kann das der Arbeitspeicher wieder freigegeben wird und der nicht mehr so viel verbraucht.
danke im voraus schon mal 
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 02.01.08 22:40
Da kann ich wohl meinen Post von gerade eben noch mal schreiben
Wenn du selbst erstellte Klassen benutzt, achte auch auf die richtigen Destructoren. Die sollten wirklich alle Klassen wieder freigeben, die für dieses Objekt benutzt wurden.
Und natürlich solltest du auch sonst auf Objekte achten, die zwar erstellt, aber nicht wieder ordnungsgemäß freigegeben wurden. Die größte Fehlerquelle liegt hier in Schleifen etc., da dort oft ständig neue Objekte erstellt werden.
Du kannst auch mal versuchen, mit dem Windows-Task-Manager den Arbeitsspeicherverlauf anzusehen. Steigt dieser immer bei bestimmten Aktionen? Ist irgendeine Regelmäßigkeit zu beobachten?
Viel Glück noch beim Debuggen.
|
|
sideruner 
      
Beiträge: 41
|
Verfasst: Mi 02.01.08 23:19
also der code sieht folgender maßen aus
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, MOZILLACONTROLLib_TLB;
type TForm1 = class(TForm) MozillaBrowser1: TMozillaBrowser; Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin mozillabrowser1.Navigate(edit1.text); end;
end. |
immer wenn ich jetzt auf button1 klicke und der browser eine seite zb www.google.de lädt dann erweitert sich der speicherverbrauch um ca 2kb.. wenn ich dann eine andere seite aufrufe dann passiert genau das selbe wieder. Ruf ich danach wieder google auf dann bleibt der speicherverbrauch jedoch gleich.
Ich schätze mal das mozilla die seite in variablen speichert. Wie kann ich das verhindern?
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 02.01.08 23:36
Ich glaube, ich weiß des Rätsels Lösung: Cache
Der Browser wird wohl einen Cache für jede Seite benutzen, und der ist natürlich bei solchen kleinen Mengen noch im Arbeitsspeicher. Probier doch mal aus, eine größere Seite herunterzuladen, ob er dann nicht doch auf die Festplatte wandert.
Woher hast du eigentlich die Unit MOZILLACONTROLLib_TLB? Gibt's die irgendwo kostenlos?
|
|
sideruner 
      
Beiträge: 41
|
Verfasst: Mi 02.01.08 23:41
ja die gibts kostenlos, hab mir den installer für die Tmozillabrowser komponente runtergeladen.
Also so weit ich weiß speichert der browser die seiten nicht. also ich hab davon noch nix mitgekommen das der das macht. Soll der auch gar nicht machen!
Aber wenn der die cache noch im arbeitspeicher hat, gibt es da irgendwo einen befehl das wenn der browser eine andere seite aufruft das dann die vorherige seite aus dem arbeitspeicher entfernt wird?
|
|
sideruner 
      
Beiträge: 41
|
Verfasst: Do 03.01.08 13:07
Achja was mir jetzt grade so auffält. Ich hab die falschen größen angegeben. Das sind keine kb's sondern MB's. Deswegen ist mir das auch so wichtig das ich den speicher irgendwie wieder freigeben kann weil sonst das programm mal eben locker auf 80MB im arbeitspeicher kommt und immer weiter ansteigt.
Hab schon versucht die mozillabrowser komponente zur laufzeit zu erstellen und nach 5 mal seite eingeben den destructor auf zu rufen. Die komponente verschwindet und ich kann auch nicht mehr darauf zu greifen, aber der der arbeitspeicherverbrauch bleit trotzdem der selbe. Ist vllt irgendwo ein fehler in der browser komponente?
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Do 03.01.08 13:17
benutzt du
destroy
zum zerstören ?
gibt es evtl auch ein
free ?
habe bei mir festgestellt,
das free meistens 'besser arbeitet'.
Vielleicht hilfts ?
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 03.01.08 13:24
Free ruft nur den Desktruktor Destroy auf. Mit einer kleinen Sicherheitsüberprüfung, ob das Objekt überhaupt noch existiert etc., sodass Free jederzeit aufgerufen werden kann. Es kann nur sein, dass die Programmierer dieser Komponente die Methode Free statt Destroy überschrieben haben, um ihren Arbeitsspeicher wieder freizugeben. Aber ein Versuch ist es wert.
|
|
sideruner 
      
Beiträge: 41
|
Verfasst: Do 03.01.08 13:31
das mit free hab ich natürlich schon ausprobiert, aber da passiert nichts anderes als bei destroy.
Komponente wird halt zerstört, aber der Arbeitsspeicher wird nicht freigegeben.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 03.01.08 13:34
Hast du vielleicht den Source der Komponente? Dann könntest du ein wenig darin herumstöbern, und schauen, wo der Arbeitsspeicher hochgeht. Vielleicht lässt sich daraus etwas ablesen. Oder du schaust nach einem Forum über die Komponente, vielleicht ist das ein schon bekannter Bug. Du kannst ja auch mal nach Updates suchen.
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 03.01.08 13:42
Dass der Speicher nicht freigegeben wird, liegt an der Speicherverwaltung von Delphi. Der Gedanke dabei ist: "Was ich einmal gebraucht habe, werde ich wahrscheinlich demnächst nochmal brauchen. Damit ich dann nicht wieder beim OS betteln muss, behalte ich das erstmal und verwende den nicht benutzten Platz später wieder."
_________________ We are, we were and will not be.
|
|
sideruner 
      
Beiträge: 41
|
Verfasst: Do 03.01.08 13:44
Ich benutze die activeX komponente von mozilla und die wurde leider schon lange nciht meht updatet. Ne an den source komm ich leider nicht ran.... sonst hätt ich schon versucht da ma mich um zu schauen.
Im internet hab ich leider nciht viel gefunden über die activeX komponente von mozilla, aber beim embeddedWB scheint es genau das selbe problem zu sein www.bsalsa.com/forum/showthread.php?t=342
|
|
sideruner 
      
Beiträge: 41
|
Verfasst: Do 03.01.08 14:11
also komischerweiße konnte ich jetzt doch die unit MOZILLACONTROLLib_TLB öffnen.. musste nur manuel die .pas datei suchen:P. Aber schlauer bin ich daruas jetzt auch nicht geworden.
Ich bin doch bestimmt nicht der erste der dieses problem hat. Weiß nciht irgendwer ne lösung?...pls...
|
|
sideruner 
      
Beiträge: 41
|
Verfasst: Do 03.01.08 15:13
Hab den artikel von gausi jetzt erst gesehen. Also wenn das delphi so macht dann kann ich mit destroy oder free nichts bewirken.
kann ich den zb mit getmem speicher für die Tmozillabrowser komponente belegen und dann zb nach dem 5 mal eine seite geladen wurde mit freemem den speicher wieder freigeben?
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 03.01.08 15:18
Soweit ich weiß nicht. Der Speicher ist ja an und für sich frei und wird von der Anwendung selbst bei Bedarf wieder recyclet. Nur wird das Windows nicht mitgeteilt, so dass im Taskmanager die Speicherauslastung nicht wieder sinkt.
_________________ We are, we were and will not be.
|
|
sideruner 
      
Beiträge: 41
|
Verfasst: Do 03.01.08 15:24
korrigier mich bitte wenn ich das falsch verstanden habe,
Also der Speicher wird freigegeben aber im taskmanager wird das nicht angezeigt und daher verbraucht eigentlich das programm gar nich so viel speicher wie angezeigt?!
Aber wenn windows nicht gesagt wird das der speicher freigegeben wurde, dann denkt windwos ja das der speicher belegt ist und kann deswegen nicht drauf zu greifen. Also herrscht eigentlich kein speicher problem sondern nur die mitteilung das der speicher freigegeben wurde findet erst nach beenden des programmes statt.
Wenn dem so ist dann könnte man ja mit delphi eigentlich keinen browser schreiben oder?
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 03.01.08 15:38
Ich versuchs mal anschaulich, wie ich mir das so vorstelle. Du sitz in deinem Büro, und willst mit Leuten reden. Dafür brauchst du 10 Stühle, die du in der Verwaltung anforderst. Dann quatschst du mit den Leuten, und verabschiedest die dann irgendwann, und die Stühle sind wieder leer.
Du bist aber ein kleiner Asi und sagst in der Verwaltung nicht Bescheid, dass die Stühle wieder frei sind, sondern behälst die weiter. Denn in 10 Minuten steht die nächste Besprechung an, mit 6 Leuten. Anstelle nun die 10 Stühle zurückzuschleppen und in 10 Minuten wieder 6 Stühle aus der Verwaltung zu holen, behälst du die Stühle einfach, und die 6 neuen Leute dürfen sich auf die 10 Stühle setzen. Dann kommen 15 Nachzügler, und ein paar Stühle müssen aus der Verwaltung dazugestellt werden usw.
Zu einem Problem wird das nur, wenn man die Leute, mit denen man nicht mehr quatschen will, nicht verabschiedet, und die Stühle im Büro nicht freiwerden - denn dann müssen immer wieder neue Stühle angefordert werden.
Aber natürlich kann man mit Delphi einen Browser schreiben.
_________________ We are, we were and will not be.
|
|
sideruner 
      
Beiträge: 41
|
Verfasst: Do 03.01.08 15:44
geile beschreibung
wie kann ich das denn mit mozilla machen das ich "die Leute verabschiede und die stühle wieder frei werden"?
Das muss doch bestimmt irgendwie gehn. Ich glaube nciht das delphi so eingestellt ist das das nicht möglich wäre.
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 03.01.08 15:49
Dafür muss man die erstellten Objekte (die eingeladenen Leute, die die Stühle/Speicher belegen) wieder freigeben (mit .free).
_________________ We are, we were and will not be.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 03.01.08 15:51
|
|