У нас есть приложение D2007, объем памяти которого неуклонно растет при работе в Windows Server 2008 (x64, sp1).
Оно нормально ведет себя в Windows Server 2003 (x32 или x64), XP и т. Д., Где оно то вверх, то вниз как и ожидалось.
Мы пробовали с включенным диспетчером памяти или последней версией FastMM4 4.92 с теми же результатами.
Кто-нибудь пытался контролировать использование памяти любым приложением Delphi на Win2008 и подтвердил бы это?
Или будет какая-нибудь подсказка?
Точность:
- отсутствие утечек памяти в обычном смысле (и да, я хорошо знаком с FastMM и др.)
- использование памяти отслеживалось с помощью Process Explorer; как виртуальная память (частные байты), так и физическая память (рабочая память, частная) в Win2008 увеличиваются. Потребление памяти все еще растет даже при нехватке памяти. (вот как мы пришли исследовать, поскольку это привело к отказу, но только на коробках Win2008)
Обновление: // ** измененный ** // код намного проще, чем наше приложение, но показывает то же поведение.
Создание списка из 10 000 000 объектов, затем 10 000 000 интерфейсов, выполненных в 2 раза, увеличивает использовала память на ~ 60 МБ и примерно на 300 МБ больше для 100 дополнительных запусков в Windows Server 2008, но просто возвращается туда, где она была в XP.
Если вы запускаете несколько экземпляров, память не освобождается, чтобы позволить другим экземплярам работать. Вместо этого файл подкачки растет, а сервер сканирует ...
Обновление 2: см. отчет о контроле качества 73347
После дальнейшего исследования мы отследили его до критических секций, как показано в приведенном ниже коде.
Поместите этот код в простое приложение VCL с помощью кнопки. И отслеживайте с помощью Process Explorer:
он начинается с ~ 2,6 МБ и после 5 запусков (нажатий на кнопку) остается на уровне ~ 118,6 МБ.
116 МБ потеряно за 5 запусков.
//***********************
const
CS_NUMBER = 10000000;
type
TCSArray = Array[1..CS_NUMBER] of TRTLCriticalSection;
PCSArray = ^TCSArray;
procedure TestStatic;
var
csArray: PCSArray;
idx: Integer;
begin
New(csArray);
for idx := 1 to length(csArray^) do
InitializeCriticalSection(csArray^[idx]);
for idx := 1 to length(csArray^) do
DeleteCriticalSection(csArray^[idx]);
Dispose(csArray);
end;
procedure TestDynamic(const Number: Integer);
var
csArray: array of TRTLCriticalSection;
idx: Integer;
begin
SetLength(csArray, Number);
for idx := Low(csArray) to High(csArray) do
InitializeCriticalSection(csArray[idx]);
for idx := Low(csArray) to High(csArray) do
DeleteCriticalSection(csArray[idx]);
end;
procedure TForm4.Button1Click(Sender: TObject);
begin
ReportMemoryLeaksOnShutdown := True;
TestStatic;
TestDynamic(CS_NUMBER);
end;
InitializeCriticalSection
на вызовы кInitializeCriticalSectionEx
и передать флагCRITICAL_SECTION_NO_DEBUG_INFO
. - person Francesca   schedule 06.08.2011