![]() |
Memory Leak bei virtuellem Speicher
Hallo,
ich habe folgendes Problem: meine Anwendung verbraucht sowohl physikalischen als auch virtuellen Speicher. Der physikalische wird immer in einem Block wieder freigegeben während der virtuelle Verbrauch irgendwann zum Absturz führt. Ich hatte das Problem früher auch schon, konnte aber dann durch ordentliches Leeren von strings dieses Leak wieder schließen. Damals hat es genügt, bei allen Records und Objekten, die freigegeben werden, die strings auf '' zu setzten. Jetzt wohl nicht mehr. Und deswegen bin ich im Moment ziemlich ratlos. Gibt es sonst noch bekannte Ursachen für diesen Effekt? Gruß Pittus |
Re: Memory Leak bei virtuellem Speicher
Zitat:
Zitat:
Zitat:
Und den Unterschied zwischen physikalischem und virtuellen und linearen usw. usf. Speicher solltest du dir nochmal ansehen. |
Re: Memory Leak bei virtuellem Speicher
Gegenfrage: Wie kann man eigentlich unter Programmkontrolle angeben, welche Speicherart man gerne hätte?
:gruebel: Sherlock |
Re: Memory Leak bei virtuellem Speicher
Zitat:
|
Re: Memory Leak bei virtuellem Speicher
Zitat:
Notwendig/interessant ist dies nur in wenigen Fällen... Um ein praktisches Beispiel zu nennen: Eine Klasse in einer Anwendung fordert mehrere hunderttausend kleine Speicherbereiche an (zum Beispiel Dateinamen). Nutzt diese Klasse den Standard-Heap der Anwendung, dann wird es - trotz Freigabe aller Speicherbereiche - zur Heap-Fragmentierung kommen. Diese ungenutzten "Lücken" im Heap können im Laufe der Zeit dazu führen, dass für eine Anforderung eines größeren Blocks kein zusammenhängender freier Speicherbereich gefunden wird. Es steht also theoretisch genug freier Speicher zur Verfügung, aber nicht genug für große Blöcke. Wenn dies alles zutrifft, dann kann man darüber nachdenken, für diese "Liste" einen eigenen Heap zu verwenden, der anschließend komplett freigegeben werden kann. Topic: Für records gibt es Finalize (System.pas). |
Re: Memory Leak bei virtuellem Speicher
Hallo,
vielen Dank für eure Antworten und Anregungen. Das Problem scheint gelöst :dancer: und die Lösung könnte für andere auch interessant sein. Die Ursache lag in der Komponente TIdTCPServer, die ich auf einem Datenmodul hatte. Ich arbeite viel mit den Indy-TCP-Komponenten und hatte bisher keine Probleme damit (im Gegenteil!). Diese Komponente hatte jedoch offensichtlich einen "Schuss". Nachdem ich die Komponente gelöscht habe und sie beim Programmstart als Objekt erzeuge (und eben nicht auf dem Datenmodul platziere) ist mein Speicher stabil. Das war die einzige Änderung. :!: Ich kann mir das zwar nicht erklären aber ich hatte bereits solche Effekte beim TdxTreeList und anderen komplexeren Komponenten. Da hat es aber meist genügt, die Komponente runterzuschmeißen und neu abzulegen. Diesmal nicht, wahrscheinlich hätte ich das Datenmodul neu erzeugen müssen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 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-2025 by Thomas Breitkreuz