Про работу с кучей в Vista
От: Аноним  
Дата: 20.05.09 10:38
Оценка:
Привет всем,
вопрос по работе с памятью в Vista —
есть приложение, которое занимается длительными вычислениями, загружая данные с SQL сервера.
Естественно, виртуальной памяти потребляется много, поэтому
встроен механизи сборки мусора, если приложение не активно и нет ввода пользователя.
В Win XP и 2000 все работает превосходно, в TaskManager видно, что потребление памяти падает
с 90 до 5 Мб (это пример) в свернутом состоянии.
Но в Vista ( Ultimate ) потребление памяти вообще не меняется, как было 90, так и есть, хотя в логфайле приложения
читаем, что деструкторы вызываются. Учетная запись пользователя не админская, файлы в закрытых для записи каталогах не используются.
Компилятор MS VC ++ 6.0 Enterprice. От типа SQL сервера это не зависит, проверено. Пример кода удаления обьектов:


CArray<CModuleDescriptor*,CModuleDescriptor*> objects;
.   .   .
void Cleanup2()
    {
        for( int i=0;i<objects.GetSize();i++)
        {
            delete objects[i];
            objects[i] = 0;
        }

        objects.RemoveAll();
    };


Что это может быть, вопрос к тем кто уже с этим сталкивался — это неправильно работают
malloc — free, или в Vista вообще другой механизм работы с кучей процесса, или в какую сторону рыть ???
Re: Про работу с кучей в Vista
От: quodum  
Дата: 20.05.09 10:59
Оценка:
Здравствуйте, Аноним, Вы писали:

Попробуйте в конце вашей Cleanup2 вставить вызов SetProcessWorkingSetSize(GetCurrentProces(), -1, -1). (Только успех вызова проверьте, а то чёрт её, висту, знает, какие там привилегии).

Если после этого результат появится, можете убирать вызов обратно: всё в порядке, система сама сбросит working set, когда ей понадобится память. Если не поможет, попробуйте поглядеть адресное пространство своего процесса утилитой vmmap от Sysinternals (ныне Microsoft).
Re[2]: Про работу с кучей в Vista
От: Аноним  
Дата: 20.05.09 11:28
Оценка:
Здравствуйте, quodum, Вы писали:

Q>Здравствуйте, Аноним, Вы писали:


Q>Попробуйте в конце вашей Cleanup2 вставить вызов SetProcessWorkingSetSize(GetCurrentProces(), -1, -1). (Только успех вызова проверьте, а то чёрт её, висту, знает, какие там привилегии).


Q>Если после этого результат появится, можете убирать вызов обратно: всё в порядке, система сама сбросит working set, когда ей понадобится память. Если не поможет, попробуйте поглядеть адресное пространство своего процесса утилитой vmmap от Sysinternals (ныне Microsoft).


Спасибо, все сбрасывается. Vmmap тоже посмотрю.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.