Solved

get memory usage in KB?

Posted on 2003-12-02
7
972 Views
Last Modified: 2012-06-22
Hi ,
i am trying to get the memory usage of each running process in KB(similar to the task manager in windows NT)
for this i found the following code in previous post:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/perfmon/base/collecting_memory_usage_information_for_a_process.asp

But the output i get is in the following format:
Process ID: 600
        PageFaultCount: 0x000000F7
        PeakWorkingSetSize: 0x000F9000
        WorkingSetSize: 0x000F9000
        QuotaPeakPagedPoolUsage: 0x00002BFC
        QuotaPagedPoolUsage: 0x00002AC0
        QuotaPeakNonPagedPoolUsage: 0x000006A4
        QuotaNonPagedPoolUsage: 0x00000684
        PagefileUsage: 0x0003B000
        PeakPagefileUsage: 0x0003B000

How can i get memory usage in KB format?

The code is given below:

#include "stdafx.h"
#define _WIN32_WINNT 0x0400//0x0501
#include <windows.h>
#include <stdio.h>
#include "Psapi.h"

void PrintMemoryInfo( DWORD processID )
{
   HANDLE hProcess;
   PROCESS_MEMORY_COUNTERS pmc;

   // Print the process identifier.

   printf( "\nProcess ID: %u\n", processID );

   // Print information about the memory usage of the process.

   hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ,
                                   FALSE, processID );
   if (NULL == hProcess)
       return;

   if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
   {
       printf( "\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount );
       printf( "\tPeakWorkingSetSize: 0x%08X\n",
                  pmc.PeakWorkingSetSize );
       printf( "\tWorkingSetSize: 0x%08X\n", pmc.WorkingSetSize );
       printf( "\tQuotaPeakPagedPoolUsage: 0x%08X\n",
                  pmc.QuotaPeakPagedPoolUsage );
       printf( "\tQuotaPagedPoolUsage: 0x%08X\n",
                  pmc.QuotaPagedPoolUsage );
       printf( "\tQuotaPeakNonPagedPoolUsage: 0x%08X\n",
                  pmc.QuotaPeakNonPagedPoolUsage );
       printf( "\tQuotaNonPagedPoolUsage: 0x%08X\n",
                  pmc.QuotaNonPagedPoolUsage );
       printf( "\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage );
        printf( "\tPeakPagefileUsage: 0x%08X\n",
                  pmc.PeakPagefileUsage );
   }

   CloseHandle( hProcess );
}


int _tmain(int argc, _TCHAR* argv[])
{
   // Get the list of process identifiers.

   DWORD aProcesses[1024], cbNeeded, cProcesses;
   unsigned int i;

   if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
       return 0;

   // Calculate how many process identifiers were returned.

   cProcesses = cbNeeded / sizeof(DWORD);

   // Print the memory usage for each process

   for ( i = 0; i < cProcesses; i++ )
       PrintMemoryInfo( aProcesses[i] );



   return 0;





Thanks.
0
Comment
Question by:saifnawaz
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
7 Comments
 
LVL 86

Expert Comment

by:jkr
ID: 9862193
>>How can i get memory usage in KB format?

You need to replace the '0x%08X' format specifier with '%d' - the values are already given in KB.
0
 

Author Comment

by:saifnawaz
ID: 9869180
hi,
I did replace it with %d and the result is:
Process ID: 8
        PageFaultCount: 2529
        PeakWorkingSetSize: 651264
        WorkingSetSize: 217088
        QuotaPeakPagedPoolUsage: 0
        QuotaPagedPoolUsage: 0
        QuotaPeakNonPagedPoolUsage
        QuotaNonPagedPoolUsage: 0
        PagefileUsage: 24576
        PeakPagefileUsage: 172032

how do i get the mem usage of the process form this which is equal to the current mem usage of the process in task manager.Can i calculate the memusage from the above values?
0
 
LVL 86

Expert Comment

by:jkr
ID: 9869245
For that purpose, I wouldn't use the above - the following is a bit easier:

MEMORYSTATUS ms;

GlobalMemoryStatus ( &ms);

DWORD dwMemUsage = ms.dwTotalVirtual - ms.dwAvailVirtual;

From teh docs:

dwTotalVirtual
Indicates the total number of bytes that can be described in the user mode portion of the virtual address space of the calling process.


0
[Live Webinar] The Cloud Skills Gap

As Cloud technologies come of age, business leaders grapple with the impact it has on their team's skills and the gap associated with the use of a cloud platform.

Join experts from 451 Research and Concerto Cloud Services on July 27th where we will examine fact and fiction.

 

Author Comment

by:saifnawaz
ID: 9869258
But will this give me the memory used by all the running processes?
I need to get the memory usage of all the running processes from my code
0
 

Author Comment

by:saifnawaz
ID: 9869265
By all the running processes, i mean the memory used by each process running
0
 
LVL 86

Accepted Solution

by:
jkr earned 250 total points
ID: 9869276
Ooops, that works for the calling process only - actually, the total memory usage is the working set (virtual pages resident in physical memory) size plus the page file usage, IOW pmc.WorkingSetSize + pmc.PagefileUsage

0
 

Author Comment

by:saifnawaz
ID: 9869617
hmm i seem to have got it
the values given are bytes and the memory used is basically the workings set size
i got the values in kb by (workings set size/1024)
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Written by John Humphreys C++ Threading and the POSIX Library This article will cover the basic information that you need to know in order to make use of the POSIX threading library available for C and C++ on UNIX and most Linux systems.   [s…
Introduction This article is the first in a series of articles about the C/C++ Visual Studio Express debugger.  It provides a quick start guide in using the debugger. Part 2 focuses on additional topics in breakpoints.  Lastly, Part 3 focuses on th…
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

627 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question