Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2011, 22:09   #1
Alexandr555
Форумчанин
 
Регистрация: 23.03.2011
Сообщений: 310
По умолчанию Объем оперативной памяти

Каким способом можно узнать объем оперативной памяти который занимает приложение? Нужно именно программно, а не через такс менеджер например.
Alexandr555 вне форума Ответить с цитированием
Старый 05.10.2011, 20:09   #2
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

таск менеджер получает эту информацию через функцию NtQuerySystemInformation. Она позволяет получить инфу о всех процессах. Информацию по конкретному процессу можно получить через функцию NtQueryInformationProcess с ключом ProcessVmCounters. Копать в эту сторону
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Старый 07.10.2011, 15:25   #3
Alexandr555
Форумчанин
 
Регистрация: 23.03.2011
Сообщений: 310
По умолчанию

Ох что же я ответ пропустил! Спасибо, попробую гм
Alexandr555 вне форума Ответить с цитированием
Старый 07.10.2011, 15:37   #4
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

что-то я переборщила с NtQueryInformationProcess.
можно проще, через GetProcessMemoryInfo, эта функция является оболочкой вокруг NtQueryInformationProcess(.., ProcessVmCounters,....)
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Старый 07.10.2011, 16:38   #5
Alexandr555
Форумчанин
 
Регистрация: 23.03.2011
Сообщений: 310
По умолчанию

Код:
 procedure TForm1.Button1Click(Sender: TObject);
 var
   pmc: PPROCESS_MEMORY_COUNTERS;
   cb: Integer;
 begin
   cb := SizeOf(_PROCESS_MEMORY_COUNTERS);
   GetMem(pmc, cb);
   pmc^.cb := cb;
   if GetProcessMemoryInfo(GetCurrentProcess(), pmc, cb) then
     Label1.Caption := IntToStr(pmc^.WorkingSetSize) + ' Bytes'
   else
     Label1.Caption := 'Unable to retrieve memory usage structure';

   FreeMem(pmc);
 end;
если вы имеете ввиду так то это не то какбы
Alexandr555 вне форума Ответить с цитированием
Старый 07.10.2011, 16:53   #6
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

так он работает или нет?
просто сейчас под рукой нет компилятора проверила бы, если я не ошибаюсь QuotaPagedPoolUsage это "Объём виртуальной памяти" в диспетчере. потыкавшись можно найти соответствие между полями структуры и полями диспетчера. тупо всё вывести и найти соответствие
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Старый 07.10.2011, 17:03   #7
Alexandr555
Форумчанин
 
Регистрация: 23.03.2011
Сообщений: 310
По умолчанию

работает выдает в 6 раз больше чем есть приблизительно
Цитата:
WorkingSetSize определяет количество страниц физической оперативной памяти, которое одновременно доступно твоему процессу (остальные старницы будут виртуальными, т.е. отсвопленными). Это ограничение наложено для того, чтобы не поддерживать громадные страничные индексы для каждого процесса.
...
Вообще измерени памяти в Windows достаточно тонкая штука. В свое время писал оболочку для соревнований, так там память считается довольно хитрыми методами .
Действительно WorkingSetSize можно использовать для определения размера памяти, используемой программой. Но при это нужно учитывать, что она показывает только ИСПОЛЬЗОВАННУЮ память. Т.е. например, ты выделил блок размером 1Мб, но Windows не будет выделять эту память реально до тех пор, пока ты к этой памяти не обратишся, соответсвенно и WorkingSetSize увеличиваться не будет. После того как ты обратишься к перовому байты выделенной памяти, будет выделена память размером в страницу (опять не весь 1 Мб). WorkingSetSize увеличится на размер страницы. Тоже самое происходит и при статическом выделении памяти под переменные.
Вообще, винда исповедует "ленивое" управление памятью, например если ты загружаешь программу, то она отображает ее на память, но реально не грузит. Загрузка страницы данных в физическую память происходит при первом обрашении к этой странице. Именно в момент такой загрузки и выделяется память, а также увеличивается WorkingSetSize на размер страницы.

З.Ы. Кстати, такой механизм загрузки портит много крови, так как обращение к какой-нибудь DLL может резко увеличивать WorkingSetSize даже при том, что эта DLL может вообще не выделять память
я думаю вот по этому
Цитата:
найти соответствие между полями структуры и полями диспетчера. тупо всё вывести и найти соответствие
сие не сработает
Alexandr555 вне форума Ответить с цитированием
Старый 07.10.2011, 17:48   #8
Alexandr555
Форумчанин
 
Регистрация: 23.03.2011
Сообщений: 310
По умолчанию

QuotaPagedPoolUsage выдает что то в 8 примерно раз меньше действительного то что показывает диспетчер
Alexandr555 вне форума Ответить с цитированием
Старый 07.10.2011, 18:52   #9
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
   pmc: PPROCESS_MEMORY_COUNTERS;
   cb: Integer;
begin
  Memo1.Lines.Clear;
   cb := SizeOf(_PROCESS_MEMORY_COUNTERS);
   GetMem(pmc, cb);
   pmc^.cb := cb;
   if GetProcessMemoryInfo(GetCurrentProcess(), pmc, cb) then
    begin
     Memo1.Lines.Add( FloatToStr(pmc^.WorkingSetSize/1024) + ' KB');
     Memo1.Lines.Add( FloatToStr(pmc^.PagefileUsage/1024) + ' KB');
    end;
   FreeMem(pmc);
end;
PagefileUsage/1024 - ничто иное как поле "виртуальная память"
WorkingSetSize/1024 - очень близкое значение к полю "память"
(тестировалось на XP SP3)

а по большому счёту поле "виртуальная память" намного адекватнее отражает использование памяти программа. WorkingSetSize - это рабочий набор, сумма памяти занимаемой приложением и в user mode и в kernel mode, т.е. включая всю память отведённую для хранения информации о программе в системе (объект-процесс, объект-поток, хендлы и т.д.)
rpy3uH вне форума Ответить с цитированием
Старый 07.10.2011, 20:09   #10
Alexandr555
Форумчанин
 
Регистрация: 23.03.2011
Сообщений: 310
По умолчанию

хех что поделать буду на PagefileUsage орентироваться
Alexandr555 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объём оперативной памяти _-Re@l-_ Общие вопросы Delphi 2 16.06.2010 12:58
объем статической памяти Juffin Общие вопросы Delphi 1 10.11.2009 16:07
Ремонт оперативной памяти. С.М.С Компьютерное железо 6 06.06.2009 17:20
Восстановить из оперативной памяти Problemaumenya Помощь студентам 1 08.05.2008 23:01
выделение оперативной памяти Alar Общие вопросы Delphi 0 29.10.2006 21:56