Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Arbeitsspeicher saugt sich voll (https://www.delphipraxis.net/158753-arbeitsspeicher-saugt-sich-voll.html)

youuu 1. Mär 2011 13:41

Arbeitsspeicher saugt sich voll
 
Hi,

ich hab ein Problem, ich hab ein Programm, welches ich mit ca. 30 Threads laufen lasse (4 Kerne).
Diese Threads erstellen eine Klasse, welche sämtliche Aufgaben ab arbeitet,
z.B.
- Source holen per Indy.Get
- Source bearbeiten
- Source in Document übergeben

mit dieser Funktion:

Delphi-Quellcode:
function THtmlSearch.GetDocument(const markup: WideString): IDispatch;
var
  doc: OleVariant;
begin
  CoInitialize(nil);
  Result := CoHtmlDocument.Create;
  doc := Result;
  doc.Open;
  doc.Write(markup);
  doc.Close;
  CoUnInitialize;
end;
später wird im finally Block, die Klasse wieder frei gegeben.
Jedoch wird jedesmal der Arbeitsspeicher beim erstellen der Klasse belastet, aber beim Frei geben per FreeAndNil() nicht wieder entlastet.

So dass ich irgendwann an die 1 GB und manchmal wesentlich mehr in anspruch nehme und es bei der 2GB Grenze natürlich kracht.

Gibt es da eine Lösung?

Bernhard Geyer 1. Mär 2011 13:50

AW: Arbeitsspeicher saugt sich voll
 
CoHtmlDocument? Hört sich nach IE an.

1, Es ist "normal" beim IE das man manche Angeforderte Interfaces mit _Release explizite 1-2 mal nochmals freigeben muss da dier IE interne sonst diese Ressourcen nicht freigibt

2, Die Verwendung von CoInitialize(nil)/CoUninitialize muss so erfolgen das alle Interfaces die du anforderst vor CoUnInitialize auch wieder freigegeben sind. CoInitialize(nil) rufst du am besten beim Tread-Beginn an, CoUninitialize beim Thread-Ende.

himitsu 1. Mär 2011 14:09

AW: Arbeitsspeicher saugt sich voll
 
CoUnInitialize ... du gibst die COM-Library frei, bevor die COM-Objekte in doc und vorallem im Result freigegeben wurden?

youuu 1. Mär 2011 14:18

AW: Arbeitsspeicher saugt sich voll
 
Ok CoInitialize und CoUnInitialize ist geändert, so dass es bei Threadbegin und Threadende gesetzt wurde, allerdings saugt der Speicher sich weiterhin voll.

Kann es also nur darin liegen das ich das Interface wieder freigeben muss?

Luckie 1. Mär 2011 14:23

AW: Arbeitsspeicher saugt sich voll
 
Setze das Interface mal auf NIL, wenn du es nicht mehr brauchst. Freigeben kann man ein Interface nicht.

Bernhard Geyer 1. Mär 2011 14:25

AW: Arbeitsspeicher saugt sich voll
 
Zitat:

Zitat von Luckie (Beitrag 1085152)
Setze das Interface mal auf NIL, wenn du es nicht mehr brauchst. Freigeben kann man ein Interface nicht.

Normalerweise muss man das nicht. Beim IE muss man aber ab und zu bei Interface auch mal _Release aufrufen.

youuu 1. Mär 2011 14:34

AW: Arbeitsspeicher saugt sich voll
 
Hm, wie ruf ich das denn am besten auf?

Ich verwende es so weiter:

Delphi-Quellcode:
  doc := GetDocument( slSource );

  document := doc as IHtmlDocument2;

Bernhard Geyer 1. Mär 2011 14:52

AW: Arbeitsspeicher saugt sich voll
 
Delphi-Quellcode:
  doc := GetDocument( slSource );
  document := doc as IHtmlDocument2;
 
  ...

  doc._Release;


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