Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Speichernutzung eines Threads (https://www.delphipraxis.net/212759-speichernutzung-eines-threads.html)

Hobbycoder 27. Mär 2023 13:21

Speichernutzung eines Threads
 
Hi,

kann man in einem Thread den tatsächlichen, aktuelle Speicherbedarf dieses Threads ermitteln (mit allen darin erzeugten Objects). Wenn ja, wie geht das?

himitsu 27. Mär 2023 13:38

AW: Speichernutzung eines Threads
 
Nein.



Vielleicht mit FastMM im FullDebugMode, wenn er zu den Speicheranforderungen die ThreadID und CodeAdresse speichert.
Aber das drifft natürlich nur Speicheranforderungen über den Delphi-Speichermanager, aber nicht den vom OLE oder direkt VirtualAlloc und Co.

Ein ShortString liegt direkt auf dem Heap, bzw. "in" einem Objekt/Record drin,
die anderen LongStrings (AnsiString, UnicodeString/String, UTF8String usw.) liegen im DelphiMM,
aber ein WideString wird über die OleAuth-API verwaltet und nutzt demnach deren Speichermanager.

Variant (Strings/Arrays/Pointer) liegt ebenfalls oft außerhalb.

...



Man könnte sich selber in GetMem/FreeMem reinhängen und dort z.B. mitzählen.

KodeZwerg 27. Mär 2023 21:07

AW: Speichernutzung eines Threads
 
Zitat:

Zitat von Hobbycoder (Beitrag 1520391)
Hi,

kann man in einem Thread den tatsächlichen, aktuelle Speicherbedarf dieses Threads ermitteln (mit allen darin erzeugten Objects). Wenn ja, wie geht das?

Ja, installiere "Process Hacker", der listet jeden Thread einzeln sehr detailliert auf.
Das "wie" kann man dem Quelltext vom Process Hacker entnehmen.

Dalai 27. Mär 2023 21:55

AW: Speichernutzung eines Threads
 
Zitat:

Zitat von KodeZwerg (Beitrag 1520416)
Ja, installiere "Process Hacker", der listet jeden Thread einzeln sehr detailliert auf.

Details liefert er, aber der Speicherverbrauch jedes Threads ist nicht dabei.

Grüße
Dalai

Uwe Raabe 27. Mär 2023 23:04

AW: Speichernutzung eines Threads
 
Wie auch - jeder Thread kann den Speicher verwenden. Einfaches Beispiel sind Nur-Lese-Zugriffe, aber auch Lese-Schreib-Zugriffe können aus unterschiedlichen Threads kommen - man sollte das halt nur thread-sicher gestalten (was auch immer das im Kontext bedeutet). Wäre das nicht möglich, würde das den Einsatz von Threads drastisch einschränken.

Delphi kennt zwar threadvar, aber darum geht es hier wohl nicht.

Vielleicht sollte man einen Schritt zurück gehen und den eigentlichen Grund der Frage betrachten?

KodeZwerg 28. Mär 2023 10:31

AW: Speichernutzung eines Threads
 
Zitat:

Zitat von Dalai (Beitrag 1520420)
Zitat:

Zitat von KodeZwerg (Beitrag 1520416)
Ja, installiere "Process Hacker", der listet jeden Thread einzeln sehr detailliert auf.

Details liefert er, aber der Speicherverbrauch jedes Threads ist nicht dabei.

Grüße
Dalai

Ahh mist, ich habe es mit Prozesse verwechselt, mein Fehler!

Hobbycoder 3. Apr 2023 12:20

AW: Speichernutzung eines Threads
 
Vielen Dank für die Anworten.
Das Problem konnte ich dann doch so lösen. Es ging darum, dass der Speicherbedarf einer Anwendung langsam aber kontinuierlich gestiegen ist. In dem Projekt gibt es viele Threads für die Datenverabreitung, und ich hätte das gerne über den Speicherbedarf der Threads ermittelt. Weil ich aber keine Lösung gefunden habe, habe ich dann Thread für Thread deaktiviert bzw. teilweise umgeschrieben. Das hat alles einen Tag in Anspruch genommen, aber letztlich zum Ziel geführt. Am Ende war es natürlich nur ein fehlendes Free im Destructor einer komplexen Datenstruktur.

shebang 3. Apr 2023 14:31

AW: Speichernutzung eines Threads
 
Zitat:

Zitat von Hobbycoder (Beitrag 1520618)
Am Ende war es natürlich nur ein fehlendes Free im Destructor einer komplexen Datenstruktur.

Nur um sicherzugehen,
Delphi-Quellcode:
ReportMemoryLeaksOnShutdown
war aktiv? Damit lassen sich solche Probleme eigentlich schnell erkennen. Das hilft natürlich nicht, wenn am Programmende ordentlich aufgeräumt wird, während der Laufzeit aber nicht.

mjustin 4. Apr 2023 18:41

AW: Speichernutzung eines Threads
 
Zitat:

Zitat von Hobbycoder (Beitrag 1520618)
VEs ging darum, dass der Speicherbedarf einer Anwendung langsam aber kontinuierlich gestiegen ist. (...) Am Ende war es natürlich nur ein fehlendes Free im Destructor einer komplexen Datenstruktur.

Ja, wenn beim Beenden des Programms aufgeräumt wird, sind Memory Leaks nicht mehr so leicht zu entdecken.
Mit dem schon genannten FastMM(4) ist es möglich (anstatt der Memory Leak Auflistung am Programmende) eine Liste der belegten Blöcke zu erstellen, und periodisch in einer Datei zu speichern. (Zum Beispiel alle 30 Sekunden). Wenn man diese dann mit einem Editor öffnet und regelmäßig aktualisiert, kann man erkennen, ob ein Memory Leak im vom Memory Manager verwalteten Speicher besteht.

Dazu habe ich vor Jahren eine kleine Demo-Anwendung erstellt. Hier ist ein Link zu einem Artikel, mit einem Screenshot:
https://mikejustin.wordpress.com/201...almm-new-demo/
(die Links im Artikel sind nicht mehr funktional)
(Es war einmal eine Demo für das jetzige Daraja HTTP Framework)

Die Grafik ist keine Zeitlinie, sondern zeigt an, wie viele Instanzen für welche Blockgrößen jeweils existieren. Wenn zu einer der Blockgrößen immer höhere Werte erreicht werden, ist das ein Indiz für ein Leak.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz