Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Используемая оперативная память процессом 
:(
    Опции темы
V0fka
Дата 5.9.2013, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Привет!

Хочу получить количество используемой оперативной памяти процессом(ами). Через Process.GetCurrentProcess().WorkingSet64 получаю память используемую текущим процессом. Полученное значение делю на 1024 и сравниваю с тем, что показывает диспетчер задач (колонка "Память (частный рабочий набор)"). У меня получается значение 70758400 / 1024 = 69100, а в диспетчере задач показывает 40420. Как получить то значение, которое показывает диспетчер?
PM MAIL   Вверх
Fobos
Дата 5.9.2013, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 9.2.2008
Где: Москва

Репутация: нет
Всего: нет



По памяти скажу так, получение такой информации из дотнета как-то усложнено и не обладает полным функционалом. 
Кажется основные способы - 
  •  P/Invoke
  •  Performance counters

МОжете в эту сторону покопать.
PM MAIL ICQ   Вверх
V0fka
Дата 6.9.2013, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Попробовал через p/invoke.

Код

[StructLayout(LayoutKind.Sequential, Size = 40)]
        private struct PROCESS_MEMORY_COUNTERS
        {
            public uint cb;             // The size of the structure, in bytes (DWORD).
            public uint PageFaultCount;         // The number of page faults (DWORD).
            public uint PeakWorkingSetSize;     // The peak working set size, in bytes (SIZE_T).
            public uint WorkingSetSize;         // The current working set size, in bytes (SIZE_T).
            public uint QuotaPeakPagedPoolUsage;    // The peak paged pool usage, in bytes (SIZE_T).
            public uint QuotaPagedPoolUsage;    // The current paged pool usage, in bytes (SIZE_T).
            public uint QuotaPeakNonPagedPoolUsage; // The peak nonpaged pool usage, in bytes (SIZE_T).
            public uint QuotaNonPagedPoolUsage;     // The current nonpaged pool usage, in bytes (SIZE_T).
            public uint PagefileUsage;          // The Commit Charge value in bytes for this process (SIZE_T). Commit Charge is the total amount of memory that the memory manager has committed for a running process.
            public uint PeakPagefileUsage;      // The peak value in bytes of the Commit Charge during the lifetime of this process (SIZE_T).
        }

...

private uint GetProcessMemory(Process process)
        {
            IntPtr Handle = OpenProcess(ProcessAccessFlags.QueryInformation | ProcessAccessFlags.VMRead, false, process.Id);
            PROCESS_MEMORY_COUNTERS memoryCounters;
            unsafe
            {
                memoryCounters.cb = (uint)sizeof(PROCESS_MEMORY_COUNTERS);
            }
            
            uint memory = 0;
            if (GetProcessMemoryInfo(Handle, out memoryCounters, memoryCounters.cb))
            {
                memory = memoryCounters.WorkingSetSize;
            }

            return memory;
        }


Сама программа компилируется и работает как-то, но есть пара проблем. Память всеравно не совпадает. Причем в интернете вычитал (кстати, это на самом деле так?), что реальная память отображается в колонке диспетчера задач "Выделенная память", а я смотрел изначально в "Память (частный рабочий набор)". Но не совпадает не с тем, не с тем полем. Так же обнаружил, что GetProcessMemoryInfo не всегда возвращает true. Почему?

Это сообщение отредактировал(а) V0fka - 6.9.2013, 15:14
PM MAIL   Вверх
V0fka
Дата 6.9.2013, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Так, значение примерно совпадает с колонкой "Память". Причем WorkingSet64 возвращает именно это значение. Но вопросы остались такие:
1) Почему всетаки GetProcessMemoryInfo не всегда возвращает true
2) Почему в диспетчере задач пишет, что использовано 85% памяти, хотя из суммы по колонке "Память" - значение раза в полтора отличается от того, что говорит диспетчер задач.
PM MAIL   Вверх
Fobos
Дата 7.9.2013, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 9.2.2008
Где: Москва

Репутация: нет
Всего: нет



По поводу возвращения false:
http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx
PM MAIL ICQ   Вверх
V0fka
Дата 11.9.2013, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Fobos, по вопросу возвращения функцией false решил проблему с вашей помощью smile . Надо было прогу под админом запустить smile . Спасибо!

Вопрос 2
Цитата(V0fka @  6.9.2013,  15:31 Найти цитируемый пост)
Почему в диспетчере задач пишет, что использовано 85% памяти, хотя из суммы по колонке "Память" - значение раза в полтора отличается от того, что говорит диспетчер задач.

ещё актуальный, если что smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1031 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.