![]() |
XE3-Compiler-Speicherleck
Kennt sich zufällig jemand im Delphi aus und kann bei der Suche helfen?
Wie in ![]() Beim Kompilieren steigt der Speicher gnadenlos an und bei knapp 1,3 GB (laut Taskmanager) kommt dann ein OutOfMemory und ab da kann man mit Delphi praktisch nicht mehr arbeiten. Wenn das AQ-Time-Package noch im Delphi registriert ist, dann reagiert Delphi mehrere Minuten garnicht mehr und stützt schlußendlich ab. Ich hab jetzt erstmal nur einen kurzen Test gemacht und Speicher gesucht, welcher neu reserviert wurde (über VirtualAlloc bei Windows). In den beiden Dateien wurde alles gelöscht, was kurz vor dem Kompilieren bereits reserviert war. Dieses befindet sich in den Dateien/Speicherabbildern und der Rest wurde mit 0 gefüllt. Was komisch ist, daß sich der größte Teil wieder verflüchtigt (bis auf 100-200 MB), wenn man Datei > Alle Schließen ausführt :gruebel:, was also bedeuten würde, daß der Speicher entweder an den Projekten oder an der Projektgruppe hängt. Ein kleiner Teil des zusätzlichen Speichers kommt eventuell von den DDevExtensions (das einzige Plugin, welches aktuell in meinem XE3 rumgammelt), aber auch ohne die DDevExtensions zeigt sich dieses Problem noch, womit es nicht am Andreas liegt. Ach ja, mein Testprojekt ist eine Projektgruppe aus allen Projekten/Packages/Demos des PHP4Delphi, welche ich kompilieren lasse. > 3 kleine BPLs, davon ein Laufzeitpackage (es ist aber egal, ob dieses installiert ist, oder nicht) > 26 winzige DLLs und 21 knuffige EXEen ![]() Project3.exe.mem3_1 - enthält die zusätzlichen 602 MB kurz nach dem Kompilieren Project3.exe.mem3_2 - enthält die zusätzlichen 349 MB nachdem alle Dateien geschlossen wurden. (kleinere) Speicherlecks im Command-Line-Compiler sind ja relativ unproblematisch, da Dieser eh nicht lange lebt, aber wenn sowas die IDE mehrmals am Abend vis zum Rand vollmüllt, dann macht das keinen Spaß. Und ich kann auch nicht alle 5 Minuten in den Taskamanger gucken, um notfalls rechtzeitig den Speicher zu leeren und alles neu zu laden, bevor es abstürzt und ich nicht mehr speichern kann. Die kompletten Speicherabbilder komprimieren grade ... also falls jemand mehr braucht. |
AW: XE3-Compiler-Speicherleck
Ist zwar nur ein Workaround, aber mir hat der
![]() |
AW: XE3-Compiler-Speicherleck
Zitat:
Der Compiler hält so ziemlich alle DCU-Daten, die er einmal gelesen hat im Speicher (Unit-Cache) und ersetzt sie nur, wenn eine Unit verändert und neukompiliert wird. Der dabei ggf. freigegebene Speicher landet wieder im Compiler-Speichermanager, der ihn nicht an Windows zurückgibt, womit der IDE Speichermanager nicht an den Speicher herankommt. Wenn natürlich im Compiler ein Speicherleck ist, kann der Compiler-Speichermanager auch auf Befehl hin den Speicherblock nicht freigeben, da er ja angeblich genutzt wird. |
AW: XE3-Compiler-Speicherleck
Zitat:
Hmmm, aber daß da knapp 1 GB in der Cache anfällt, für die paar Units, kann ich erstmal nicht glauben und selbst wenn, dann wäre es doch praktisch, wenn er sich etwas entleert, sobald der RAM fast am Überlaufen ist. Das sind insgesammt 70 DCUs mit zusammen 1,99 MB auf der Platte und raus kommen dabei 47 EXE/DLL/BPLs mit zusammen 84,6 MB (als Debug-Build) und der Speicherverbrauch geht beim Build-All (laut Taskmnager) von knapp 80-250 MB auf mindestens 1,3 GB hoch. Nja, eventuell können sie ja wenigstens erstmal die 3 GB-Option für die IDE aktivieren? Dann würde der Speicher etwas länger ausreichen. :angle2: (solange bis die IDE auch irgendwann mal 64 Bit kann) |
AW: XE3-Compiler-Speicherleck
Zitat:
Zitat:
Zitat:
Kannst du diese groupproj Datei für PHP4Delphi anhängen? Es handelt sich schon um ![]() |
AW: XE3-Compiler-Speicherleck
Zitat:
Nicht das ich mich jetzt im Delphi Compiler auskenne, aber etwas dass der GCC und mein Compiler machen, ist die geparsten Daten in einen AST(ABstract Syntax Tree) zu packen(wobei mein AST vllt nicht so abstrakt ist *hust*). Das bläht natürlich auf, ist aber soweit ich gelsesen habe ein gängiger schritt bei Compilern, und es könnte gut sein, dass Delphi das auch macht. Und der AST ist dan nur ein Teil des ganzen. die DCUs die du siehst, sind lediglich "fertiger" (bereits optimierter?) bytecode, und damit recht schlank. |
AW: XE3-Compiler-Speicherleck
Im Prinzip ist das doch noch ein recht kleines Projektchen und ich komm jetzt schon an die Grenzen der IDE ... was soll denn passieren, wenn man da mal richtig an die Arbeit geht?
Zitat:
Auf Seite der Quellcodes sind's nur ein paar Kilobyte 178 Quelldateien (PAS/DFM/DPR/DPK) = 2,2 MB = 70 DCUs = 1,99 MB (inkl. Debuginfos) 47 EXE/DLL/BPLs = 84,6 MB (als Debug-Build) 1,2 GB welche in der IDE beim Kompilieren entstehen 340.000 Zeilen als Build All = 1,3 GB RAM 36.700 Zeilen als Compile All = 1,3 GB RAM (konnte ich bis vor wenige Minuten nicht machen, da es mehrere gleichnamige Units gab) Mehrfaches Kompilieren einer Unit macht verursacht wenigstens nicht gleich mehr Speicher. @jbg: Jupp. ![]() Versuche ein paar Fehler rauszumachen, welche bei der Umstellung auf Unicode eingebaut wurden und nebenbei alle APIs überarbeiten/prüfen, damit es auch mal mit 64 Bit zurechtkommt. |
AW: XE3-Compiler-Speicherleck
Krass, es gibt sogar eine eigene Ecke nur für Speicherlecks. :stupid:
![]() ![]() |
AW: XE3-Compiler-Speicherleck
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal schnell ein kleines IDE Plugin geschrieben, dass den Speicherverbrauch des Compilers auflistet.
Installation: Unter [HKCU\Software\Embarcadero\BDS\10.0\Experts] den Eintrag "DccMemAnalyzer_Debug"="C:\Somewhere\On\My\Disk\Dc cMemAnalyzer.dll" eintragen und die IDE starten. Danach sollte schon während des Splashscreens ein Fenster mit einem Memo aufgehen. Der Button "Refresh" füllt das Memo mit den aktuellen Speichermanager Daten des Compilers. Nach dem Kompilieren sieht man, dass über 700 MB an Units geladen sind. Für jedes kompiliertes Projekt wird der gesamte Unit-Betand (System.dcu, SysUtils, Classes.dcu, ...) gehalten, was das ganze so dermaßen aufbläst. |
AW: XE3-Compiler-Speicherleck
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Das heißt also, wenn die es irgendwann mal lernen Resourcen mehrfach zu nutzen, daß ich doch keine 64-Bit-IDE benötige. :angle2: Ich hatte es vorhin, alleine mit dem Bearbeiten vieler Units, geschafft, die IDE abstürzen zu lassen. War auch noch so im Tippen vertieft, daß ich nicht alle 2 Sekunden gespeichert hatte. :oops: Fazit: Ausreichend Arbeit war umsonst. Danke Emba. Ich vermute mal, daß hier das Code Insight dran Schuld war, welches ständig im Hintergrund rumkompiliert. Hab mir jetzt erstmal 'nen billigen Wächter erstellt, der mich jetzt wenigstens etwas vorwarnt. :-D Du sagtest doch vorhin was davon, daß der Speichermanager des Compileres eine Aufräumfunktion hat. Könnte man diese irgendwie aufrufen? (ohne daß es danach knallt) Bezüglich dem "seit XE ist der Compiler/Compilierspeicher an Projekte gebunden", das erklärt auch noch ein anderes Phänomen, welches mich schon etwas genervt hat. Früher konnte man schnell mal eine billige Unit erstellen oder öffnen, ohne daß sie zu einem geladenem Projekt gehört und hatte darin dennoch Funktionen, wie Code Insight und Dergleichen, zur Verfügung. Das funktioniert jetzt leider auch nicht mehr. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:22 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