Wir haben eine D2007-Anwendung, deren Speicherbedarf unter Windows Server 2008 (x64, sp1) stetig zunimmt.
Es verhält sich normalerweise unter Windows Server 2003 (x32 oder x64), XP, etc ... wo es wie erwartet auf und ab geht.
Wir haben mit dem mitgelieferten Memory Manager oder dem neuesten FastMM4 4.92 mit den gleichen Ergebnissen versucht.Wird der Speicher für Delphi-Anwendungen, die unter Windows Server 2008 (SP1) ausgeführt werden, nicht zurückgewonnen?
Hat jemand versucht, die Speichernutzung von jeder Delphi-App auf Win2008 zu überwachen und würde bestätigen?
Oder hätten Sie eine Ahnung?
Precisions:
- keine Speicherlecks im herkömmlichen Sinne (und ja, ich bin sehr vertraut mit FastMM et al)
- Speichernutzung mit Process Explorer überwacht wurde; Sowohl der virtuelle Speicher (private Bytes) als auch der physische Speicher (WorkingSet Private) wachsen auf Win2008 - der Speicherverbrauch nahm immer weiter zu, auch wenn der Speicherdruck war. (so kamen wir, um zu untersuchen, wie es zu einem Fehler kam, aber nur auf Win2008 Boxen)
Update: der // ** reparierte ** // Code ist viel einfacher als unsere App, zeigt aber das gleiche Verhalten.
Erstellen einer Liste von 10.000.000 Objekten, dann 10.000.000 Schnittstellen, ausgeführt 2 mal wächst der verwendete Speicher um ~ 60MB und etwa 300MB mehr für 100 weitere Ausführungen auf Windows Server 2008, aber kehrt nur dahin zurück, wo es auf XP war.
Wenn Sie mehrere Instanzen starten, wird der Speicher nicht freigegeben, damit die anderen Instanzen ausgeführt werden können. Stattdessen wächst die Auslagerungsdatei und der Server kriecht ...
Update 2: QC report 73347
Nach einer weiteren Untersuchung sehen, haben wir es aufgespürt Kritische Abschnitte wie in der unten stehenden Code dargestellt.
Setzen Sie diesen Code in eine einfache VCL-Anwendung mit einem Button. Und überwachen mit Process Explorer:
es beginnt bei ~ 2,6 MB und nach 5 Läufen (klickt auf den Knopf) bleibt es bei ~ 118.6MB.
116MB in 5 Ausführungen verloren.
Beziehen Sie sich auf die privaten Bytes, die virtuelle Größe oder das Working Set? Führen Sie den Process Explorer von SysInternals aus, um den Speicher zu überwachen, um eine bessere Vorstellung davon zu erhalten, was vor sich geht. http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx –
Können Sie das Problem reproduzieren, wenn Sie TestMemoryInterfaces nicht aufrufen? – Alex
Nun, ich fragte dies, weil Sie MyList.Add übergeben (TInterfaceList.Create()). Die Schnittstelle hat eine Referenznummer von null, wenn Konstruktor verlassen wird. Also kann es einen Platz für "schlechte Dinge" geben (sorry, ich habe kein Delphi zur Hand, um diese Vermutung zu bestätigen). Ich habe auf jeden Fall einen Bericht über QC über dieses Problem gesehen: Benutzer beschwert sich über mögliche versteckte Fehler in ähnlichem Code. Die Problemumgehung besteht darin, eine explizite Variable zu verwenden: I: = TInterfaceList.Create(); MyList.Add (I); – Alex