Entwickler-Ecke
Internet / Netzwerk - mozillabrowser & zu viel arbeitspeicherverbrauch
sideruner - Mi 02.01.08 22:01
Titel: mozillabrowser & zu viel arbeitspeicherverbrauch
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 - Mi 02.01.08 22:40
Da kann ich wohl meinen Post von gerade eben noch mal schreiben :D
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 - Mi 02.01.08 23:19
also der code sieht folgender maßen aus
Delphi-Quelltext
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
http://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 - Mi 02.01.08 23:36
Ich glaube, ich weiß des Rätsels Lösung: Cache :lol:
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 - 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 - 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 - 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 ?
Yogu - 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 - 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 - 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 - 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."
sideruner - 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
http://www.bsalsa.com/forum/showthread.php?t=342
sideruner - 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 - 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 - 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.
sideruner - 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 - 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.
sideruner - Do 03.01.08 15:44
geile beschreibung :D
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 - 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).
Yogu - Do 03.01.08 15:51
Das hat er doch schon versucht! (Siehe obere Posts)
:les: > :lupe: > :think: > :lol:
Gausi - Do 03.01.08 15:54
Dann liegt das evtl. daran, dass in der Mitte schon ein Stuhl besetzt ist, aber die neue Runde gerne zusammensitzen möchte ;-)
Nebenbei, hat der Firefox selbst nicht auch so ein Speicherproblem?
sideruner - Do 03.01.08 15:55
hmm firefox verbraucht manchma etwas viel speicher...keine ahnung obd er so ein problem hat.
Aber beim embeddedWB soll ja genau der selbe fehler sein
Yogu - Do 03.01.08 15:57
Mein Firefox verwendet gerade ca. 70 MB, was ich eigentlich in Ordnung finde. Ich bin ja schon ewig im Delphi-Forum und auf anderen Seiten, und diese ganzen Seiten hat der sicher noch im Arbeitsspeicher. Dauert seine Zeit, bis die im Festplatten-Cache abgelegt sind. Aber das ist doch auch gut so, dann kommend die Seiten immer schnell.
sideruner - Do 03.01.08 16:00
Also mir egal ob das die komponente von mozilla oder sonst wem ist. ich möchte ienfach nur eine browser-komponente der dieses speicherproblem nicht hat und der auch keine disk-cache benutzt.
Genie - Do 03.01.08 16:05
Tja da kam wohl der Gausi nicht mit ;-)
Gausi - Do 03.01.08 16:06
Um ehrlich zu sein, verstehe ich das Problem wirklich nicht, das du hast. Dass freigegebener Speicher nicht ans OS zurückgegeben wird, und damit der Speicherverbrauch der Anwendung für den Taskmanager nicht zurückgeht, ist afaik bei jeder Delphi-Anwendung der Fall. Es sei denn, man trickst den Speichermanager von Delphi irgendwie aus, aber das ist mir zu hoch...
sideruner - Do 03.01.08 16:06
ok so wie ich das grade bei meinem firefox beobachtet hab, hat der auch das problem. wenn selbs firfox das problem hat dann is das a) entweder von den entwicklern so gewollt damit die seiten schneller aufgerufen werden oder b) das ist ein fehler den slebst die entwickler nicht lösen konnten
sideruner - Do 03.01.08 16:08
also mein problem ist das wenn der freie speicher nicht an den taskmanager nicht zurückgegeben wird, das der dann doch eigentlich nciht frei ist oder?
frei in dem sinne das den zb ein anderes programm nutzen kann
Yogu - Do 03.01.08 16:26
Wenn du das Programm beendest, wird der Speicher doch wieder freigegeben :!: :?:
Und wenn die Anwendung noch läuft, wird der verwendete Speicher in die Auslagerungs-Datei verfrachtet, wenn eine andere Anwendung diesen Speicher braucht. Da brauchst du keine Angst zu habben :D
sideruner - Do 03.01.08 16:32
ja klar wird der speicher beim beenden des PROGRAMMES wieder freigegeben... aber erst dann.
Also kann mein program am anfang 20 MB arbeitspeicher verbrauchen und nach dem rumnavigieren ca 100MB und wenn ich dann die browser destroye, ändert sich ja nix im Taskmanager am speicherverbrauch. aber mein programm verbraucht dann nur wieder die am anfang 20MB und die anderen 80MB können andere progrmamme verwenden?!
Yogu - Do 03.01.08 20:08
Probier es doch mal aus, ganz viel mit zum Beispiel dem richtigen Firefox in den Arbeistspeicher zu laden, ob was passiert. Ich denke, der Speicher deines Programmes wird ausgelagert, und ist deswegen auch nicht weiter störend. Was ist denn dann dein Problem?
sideruner - Do 03.01.08 20:23
was meinst du mit ausgelagert?, das der speicher für das programm reserviert bleibt?
Yogu - Do 03.01.08 20:41
Der Speicher bleibt zwar reserviert, wird aber vom Arbeitsspeicher auf die Festplatte verlagert. Dadurch gibt es im realen RAM wieder Platz für neuen Speicher; der bereits reservierte Speicher geht aber nicht verloren. Wenn diese Daten wieder gebraucht werden, werden sie zurückgeholt. Da aber dieser Speicher eigentlich leer ist, wird er auch nie mehr gebraucht, und darf auf der Festplatte solange vor sich rumgammeln, bis das Programm beendet wird.
Und jetzt erzähl mir nicht, dass ein paar MB auf der Festplatte schlimm wären. Solange du keine Tausende Seiten besuchst, wird sich das nicht weiter auswirken.
sideruner - Do 03.01.08 20:57
Also ich wüsste nicht das mozilla irgendwas auf meine festplatte speichert.. zumindest nicht in den temorary internet files ordner
Yogu - Do 03.01.08 21:03
Windows regelt das für die Anwendungen. Wenn ein Programm längere Zeit nicht benutzt wurde, und der Speicher benötigt wird, dann wird der verwendete Speicher automatisch auf die Festplatte ausgelagert. Das macht nicht das Programm selber, sondern Windows.
jakobwenzel - Do 03.01.08 21:16
Und die Datei, in der das landet liegt standardmäßig auf der Systemplatte und heißt pagefile.sys.
jaenicke - Do 03.01.08 22:12
sideruner hat folgendes geschrieben: |
| ok so wie ich das grade bei meinem firefox beobachtet hab, hat der auch das problem. wenn selbs firfox das problem hat dann is das a) entweder von den entwicklern so gewollt damit die seiten schneller aufgerufen werden oder b) das ist ein fehler den slebst die entwickler nicht lösen konnten |
Ich habe gerade im Firefox, dem IE und Opera einfach immer einen Tab geöffnet, Google aufgerufen, den tab wieder geschlossen und das ganze immer wieder wiederholt.
Sowohl im Firefox 2.0 und der 3.0 Beta als auch im IE 7.0 tritt ein Arbeitsspeicherproblem auf. Bei jeder Wiederholung kamen zwischen 1 und 5 MiB Speicherverbrauch hinzu... Lediglich beim Opera blieb der Speicherverbrauch nahezu konstant.
Ich habe dies auf einem sauberen System mit frisch installiertem Windows XP mit allen Updates getestet.
Zunächst dachte ich, dass evtl. ausgelagerter Speicher zurück in den normalen Speicher geholt wird, dem ist aber nicht so. Beide Werte stiegen an...
Gausi hat folgendes geschrieben: |
| Dass freigegebener Speicher nicht ans OS zurückgegeben wird, und damit der Speicherverbrauch der Anwendung für den Taskmanager nicht zurückgeht, ist afaik bei jeder Delphi-Anwendung der Fall. |
Das ist vielleicht bei
FastMM [
http://sourceforge.net/projects/fastmm] besser, keine Ahnung. Da aber der Firefox selbst und auch der Internet Explorer nicht in Delphi geschrieben sind, glaube ich nicht, dass es ein Delphi-spezifisches Problem ist.
Es wird übrigens durchaus bei Delphiprojekten auch wieder Speicher zurückgegeben, ich habe das mit einem meiner abgeschlossenen Projekte getestet, der Speicherverbrauch geht auf bis zu 200 MiB hoch, geht aber auch wieder auf 35 MiB herunter, wenn ich die betreffenden Analysefenster schließe, auch der virtuelle Speicher verhält sich ähnlich (der Verbrauch nimmt aber trotzdem jedesmal leicht zu, geht also nicht ganz auf den ursprünglichen Wert zurück).
Yogu hat folgendes geschrieben: |
| Der Speicher bleibt zwar reserviert, wird aber vom Arbeitsspeicher auf die Festplatte verlagert. Dadurch gibt es im realen RAM wieder Platz für neuen Speicher; der bereits reservierte Speicher geht aber nicht verloren. Wenn diese Daten wieder gebraucht werden, werden sie zurückgeholt. Da aber dieser Speicher eigentlich leer ist, wird er auch nie mehr gebraucht, und darf auf der Festplatte solange vor sich rumgammeln, bis das Programm beendet wird. |
Dass das auch anders geht, sieht man aber am Opera... Der gibt den Speicher wieder zurück. Sowohl der virtuelle Speicher als auch die Speicherauslastung bleibt bei gleicher Tabanzahl relativ konstant. Öffne und schließe ich Tabs mit Google, dann geht die Speicherauslastung auch wieder fast auf den alten Wert zurück. Nicht ganz aber fast, und das dürfte auch ein Grund dafür sein, dass der Browser so schnell ist...
Ja, was kannst du tun? Ich glaube nicht viel, probier ruhig den FastMM mal aus, aber insgesamt glaube ich, dass du damit leben musst, weil du eben ein Control verwendest, das dieses Verhalten vermutlich eben zeigt. Und das musst du ja tun...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!