AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Wie kann man ein "halbes" Memory-Leak finden?

Wie kann man ein "halbes" Memory-Leak finden?

Ein Thema von Phoenix · begonnen am 28. Mai 2008 · letzter Beitrag vom 31. Mai 2008
Antwort Antwort
Seite 3 von 4     123 4   
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#21

Re: Wie kann man ein "halbes" Memory-Leak finden?

  Alt 29. Mai 2008, 10:32
schon lange nicht mehr delphifoniert, mal sehn ob ich meine ad hoc array-allokationsverwaltung noch zusammenkrieg:

Delphi-Quellcode:
var firstfree: integer;
    array: array of Typ;

function ArrayAdd(val: Typ): TResult;
begin
  if high(Array) < firstfree then
    setlength(array, length(array) * 162 div 100); //1.62 = magic number; feintunen sorgt evtl. für bessere performance je nachdem wie das array wachsen soll

  array[firstfree] := val;
  Inc(firstfree);
end;
is jetzt aus dem stegreif getippt und sicher auch algorithmisch nicht optimal. sollte speicherfragmentation aber vorbeugen, denn das array wird immer um einen bestimmten faktor vergrößert, d.h. je größer es wird, desto seltener muss es vergrößert werden.

TList ist aber evtl. wirklich sinnvoller! (wobei ich da nicht weiß wie optimal der array da drin behandelt wird)
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.604 Beiträge
 
#22

Re: Wie kann man ein "halbes" Memory-Leak finden?

  Alt 29. Mai 2008, 10:34
Nein, ich benutze kein Com (zum Glück).

@Kapselung: Die Arrays sind gekapselt.
Ich dachte, das wäre Performancetechnisch ein Vorteil, meine Datenstrukturen in dynamischen Arrays zu verwalten, damit ich nicht den Overhead der Objektverwaltung habe an der Stele. Insbesondere wenn viel darauf gearbeitet wird.

Von daher ist das Umstellen auf TList / TObjectList auch nicht so der Riesen aufwand. Ich muss halt das array of in eine TObjectList ändern und die drei Methoden (reinpacken, rausholen, löschen) anpassen. Das halt in einigen klassen, aber so wild ist das nicht.

Aber wenn FastMM an der Stelle die Fragmentierung schonmal von sich aus zumindest eindämmen könnte, dann würde ich erstmal an deren Stellen suchen und ein Tracing für meine Datenbäume einbauen um zu sehen, wann ich da genau was drin habe und wann sich was ändert.
Sebastian Gingter
Phoenix - 不死鳥
Mein Blog: http://gingter.org
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#23

Re: Wie kann man ein "halbes" Memory-Leak finden?

  Alt 29. Mai 2008, 10:34
Nutzt du Handels direkt?
(Filehandles, Fensterhandels usw.)
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.604 Beiträge
 
#24

Re: Wie kann man ein "halbes" Memory-Leak finden?

  Alt 29. Mai 2008, 10:42
Nein, das sind keine Ressourcen. Das sind 'nur' ein haufen Objekte die ne Handvoll Daten bereitstellen, die ich in einer Art Tree verwalten muss, um da mittels Pointer-Operationen möglichst schnell drauf zugreifen zu können.

Das können halt schnell ein paar zigtausend Objekte werden, auf die ich im Worst-Case verdammt schnell zugreifen können muss. Und wenn sich an der Datenquelle was ändert, dann ändert sich halt auch ggf. der Aufbau des Trees. Und ich befürchte fast, dass ich in so einem Fall einfach irgendwo vergesse, alte, nicht mehr benötigte Objekte aufzuräumen. Die bleiben halt einfach in dem Tree hängen, aber auf diese Äste wird nie mehr zugegriffen. Am Ende wird logischerweise der ganze Baum aufgeräumt, deswegen bleiben diese Objekte auch ned liegen.
Sebastian Gingter
Phoenix - 不死鳥
Mein Blog: http://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#25

Re: Wie kann man ein "halbes" Memory-Leak finden?

  Alt 29. Mai 2008, 11:11
na dann lass doch mal das großreinemachen am ende weg. da wird dir das zeug schon ordentlich um die ohren fliegen und alle MMs mit leak-reporting (FastMM ist da echt gut!) werden dir zeigen, welche objekte da noch rumlunger,n evtl. sogar mit Klassenname und speicherbereich und zeilennummern, wo die objekte erzeugt wurden

EDIT: du kannst das natürlich auch selber machen. in die basisklasse deiner objekte (du hast sowas hoffentlich?) ein field lineofcreation: integer rein, Strg+F, ".Create", und überall zuweisen bei erstellung, und am ende alles was noch im tree hockt durchiterieren und schreien lassen.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.604 Beiträge
 
#26

Re: Wie kann man ein "halbes" Memory-Leak finden?

  Alt 29. Mai 2008, 11:14
Zitat von DGL-luke:
na dann lass doch mal das großreinemachen am ende weg.
Dann hab ich tausende Objekte da drin, von denen ich weiss dass ich sie erst am Ende aufräumen muss.

Bei den tausenden dann ggf. genau die zig Objekte zu finden, die da nicht reingehören... das ist leider Utopisch.
Sebastian Gingter
Phoenix - 不死鳥
Mein Blog: http://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#27

Re: Wie kann man ein "halbes" Memory-Leak finden?

  Alt 29. Mai 2008, 11:16
gut, dann siehe mein edit, und zusätzlich noch ein bool "lazyObject" dazu (faul=liegt bis zum ende rum )

EDIT: evtl. sogar als class const...
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.604 Beiträge
 
#28

Re: Wie kann man ein "halbes" Memory-Leak finden?

  Alt 29. Mai 2008, 11:24
Ich hab einige zigtausende Objekte, die ich definitiv bis zum Ende brauche. Da ist nix Lazy.
Zudem ergibt sich das Problem nur dann, wenn die Anwendung eine ganze Zeit lang läuft. Deswegen kann ich auch nicht kurz Anwendung starten, hier und da rumklicken und dann beenden. Ich muss die mit Live-Daten etliche Stunden / Tage laufen lassen damit das Phänomen überhaupt auftritt.

Ob da wirklich Objekte drin sind, die ich vergesse aufzuräumen ist zudem nur Vermutung. Es könnte auch tatsächlich 'nur' an Fragmentierung liegen. Es kann allerdings genausogut an einer anderen Stelle im Programm liegen, deren Verantwortliche das aber kategorisch ablehnen.

Die Idee ist nun, mit möglichst wenig Aufwand (und ohne Try & Error) herauszufinden, ob das an meinem Teil liegt oder nicht. Insbesondere, weil wir das eben hier nicht auf die schnelle reproduzieren können.
Sebastian Gingter
Phoenix - 不死鳥
Mein Blog: http://gingter.org
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#29

Re: Wie kann man ein "halbes" Memory-Leak finden?

  Alt 29. Mai 2008, 11:27
Zitat von Phoenix:
Und ich befürchte fast, dass ich in so einem Fall einfach irgendwo vergesse, alte, nicht mehr benötigte Objekte aufzuräumen.
Dann schreib dir eine Scanroutine, die nach einem Datenwechsel (wenn der Baum also aufgeräumt wird) nachschaut, ob auch wirklich alle Objekte weg sind. Dazu kannst du auch meinen Trick mit den IDs und der Liste nehmen. Einfach mitloggen, was erzeugt wird und hinterher durchgehen, welche Objekte gemeinerweise nicht freigegeben wurden...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.604 Beiträge
 
#30

Re: Wie kann man ein "halbes" Memory-Leak finden?

  Alt 29. Mai 2008, 11:30
Zitat von alzaimar:
Dann schreib dir eine Scanroutine, die nach einem Datenwechsel (wenn der Baum also aufgeräumt wird) nachschaut, ob auch wirklich alle Objekte weg sind.
Der Baum wird ja nicht aufgeräumt. Er wird nur umorganisiert.

Und diesen Code zu reviewen brauch wahrscheinlich länger, als es gedauert hat ihn zu schreiben. Und das war schon ne ganze Weile. Das allein aufgrund einer reinen Vermutung zu machen bekomme ich nicht bezahlt, und ich kann den Aufwand auch nicht vor dem Kunden vertreten.
Sebastian Gingter
Phoenix - 不死鳥
Mein Blog: http://gingter.org
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:51 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