AGB  ·  Datenschutz  ·  Impressum  







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

Speichernutzung eines Threads

Ein Thema von Hobbycoder · begonnen am 27. Mär 2023 · letzter Beitrag vom 4. Apr 2023
Antwort Antwort
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#1

Speichernutzung eines Threads

  Alt 27. Mär 2023, 13:21
Hi,

kann man in einem Thread den tatsächlichen, aktuelle Speicherbedarf dieses Threads ermitteln (mit allen darin erzeugten Objects). Wenn ja, wie geht das?
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#2

AW: Speichernutzung eines Threads

  Alt 27. Mär 2023, 13:38
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (27. Mär 2023 um 13:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Speichernutzung eines Threads

  Alt 27. Mär 2023, 21:07
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#4

AW: Speichernutzung eines Threads

  Alt 27. Mär 2023, 21:55
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#5

AW: Speichernutzung eines Threads

  Alt 27. Mär 2023, 23:04
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe (28. Mär 2023 um 10:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Speichernutzung eines Threads

  Alt 28. Mär 2023, 10:31
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!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#7

AW: Speichernutzung eines Threads

  Alt 3. Apr 2023, 12:20
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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
shebang

Registriert seit: 7. Feb 2020
124 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Speichernutzung eines Threads

  Alt 3. Apr 2023, 14:31
Am Ende war es natürlich nur ein fehlendes Free im Destructor einer komplexen Datenstruktur.
Nur um sicherzugehen, 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.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#9

AW: Speichernutzung eines Threads

  Alt 4. Apr 2023, 18:41
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.
Michael Justin
habarisoft.com
  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 01:05 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