AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IntraWeb - Speichernutzung

Ein Thema von hirnstroem · begonnen am 8. Jun 2007 · letzter Beitrag vom 8. Jun 2007
Antwort Antwort
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#1

IntraWeb - Speichernutzung

  Alt 8. Jun 2007, 06:49
'loha Folks,

ein relativ umfangreiches IntraWeb (Webapplikation) Projekt füllt nach und nach den Speicher. Dies ist wohl aus zur Laufzeit erstellte Komponenten, von welchen es einige gibt, zurückzuführen. Nun wollte ich mich erkundigen, was beispielsweise mit folgendem Konstrukt geschieht wenn das dazugehörige Formular geschlossen wird:

Delphi-Quellcode:
procedure TfrmFacility_Management_Door_Control_Select.grdDeviceRenderCell(
  ACell: TIWGridCell; const ARow, AColumn: Integer);
begin
{
  Title Row Sort Symbols
}

  if (ARow = 0)
    and (AColumn >= 0)
    and (AColumn < grdDevice.Columns.Count -1) then
  begin
    with ACell do
    begin
      Control := TIWImageFile.Create(Self); // hier wird ein Control kreiert, welches natürlich den Speicher nutzt
      with TIWImageFile(Control) do
      begin
        Hint := 'Sortieren';
        Tag := AColumn;
        UserSession.SetSortImage(UserSession.DataSet, TIWDBGridColumn(grdDevice.Columns.
          Items[(TIWImageFile(Control)).Tag]).DataField, TIWImageFile(Control));
        OnClick := Sort;
      end;
    end;
  end;
end;
Beim verlassen der Seite wird das Formular mit der Release Methode entfernt und sollte demnach den von ihm belegten Speicherplatz wieder freigeben. Nun meine ich, dass wenn sämtliche zur Laufzeit erzeugten Komponenten dem Formular angehören (Create(Self)), werden diese automatisch mit dem Schliessen des Formulares aus dem Speicher entfernt. Wenn ich jetzt allerdings sagen wir 100 User Sessions öffne, und in jeder dieser Sessions eine umfangreiche Seite lade (auf welcher viele solche zur Laufzeit erzeugten Komponenten verwendet werden), wird der speicher erwartungsgemäss gefüllt. Werden anschliessend sämtliche User Sessions beendet, somit alle Formulare und sonstigen Daten eines Users "zerstört", so nimmt die Speicherausnutzung nicht in dem Masse ab, wie ich das eigentlich erwarten würde.

Nun bin ich mir nicht sicher, ob denn die Eltern auch wirklich für ihre Kinder haften?!

Viel anderes wird zur Laufzeit nicht erzeugt und wenn, dann fast ausschliesslich mit dem Formular als Owner. Manche vom User unabhängig agierende Threads gibt es noch, welche ein recht dynamisches Leben führen, sich aber alle beim Terminieren selbst wieder freigeben.

Weiss jemand Rat?

Grüsse
hirnstroem
inde deus abest
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: IntraWeb - Speichernutzung

  Alt 8. Jun 2007, 07:20
Zitat von hirnstroem:
Nun bin ich mir nicht sicher, ob denn die Eltern auch wirklich für ihre Kinder haften?!
Teilweise.
Solange die Eltern von ihren Kinden wissen (.Create(Self)) können sie diese Auffordern aufzuräumen (.Free). Ob die Kinder nun wirklich alles aufgeräumt haben, kann man nur durch Kontrolle feststellen (z.B. FastMM).
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#3

Re: IntraWeb - Speichernutzung

  Alt 8. Jun 2007, 07:53
Dann müssten der Speicher eigentlich korrekt wieder freigegeben werden, da alles was keinen Owner hat explizit freigegeben wird und alles was einen Owner hat spätestens mit dem freigeben desselbigen auch freigegeben werden müsste.

Werde nun mit FastMM (danke für den Tipp) versuchen festzustellen was schief läuft und dies dann kund tun.
inde deus abest
  Mit Zitat antworten Zitat
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#4

Re: IntraWeb - Speichernutzung

  Alt 8. Jun 2007, 10:57
Beim Beenden der Applikation erscheint nun folgende Meldung:

This application has leadked memory...

1 - 12 bytes: TInThreadSafeInteger x 1
21- 28 bytes: TIdCriticalSection x 2
61 - 68 bytes: TRxThread x 1, TBusScanThread x 1

Die ersten zwei Zeilen sagen mir überhaupt nichts, für letztere hingegen bin ich verantwortlich. Die zwei besagten Threads sind ständig am laufen, werden aber beim Beenden der Applikation terminiert (.Terminate) und sollten sich selber freigeben (.FreeOnTerminate := True).

Ich habe schon versucht mit ".WaitFor" darauf zu warten, bis die zwei Threads sich selber terminiert sind, da tat sich aber nichts.

Nun wage ich aber zu bezweifeln, dass dies der Grund für die übermässige Speichernutzung ist, da die Threads nichts anderes tun, als, zum einen, Pakete von Geräten welche an einem CAN-Bus angeschlossen sind zu empfangen und diese in einen Buffer abzulegen (TRxThread) und, zum anderen, den Bus in periodisch zu scannen um den daran angeschlossenen Geräten beispielsweise die Uhrzeit mitzuteilen (weil der eingesetzte Quarz-Baustein relativ schnell aus dem Takt läuft). Dabei wird aber bei beiden Threads nichts zur Laufzeit generiert, ausser die Threads selbst natürlich.
inde deus abest
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 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