winapimemorymemory-managementmemory-dump

How can I find out how much of address space the application is consuming and report this to user?


I'm writing the memory manager for an application, as part of a team of twenty-odd coders. We're running out of memory quota and we need to be able to see what's going on, since we only appear to be using about 700Mb. I need to be able to report where it's all going - fragmentation etc. Any ideas?


Solution

  • You can use existing memory debugging tools for this, I found Memory Validator 1 quite useful, it is able to track both API level (heap, new...) and OS level (Virtual Memory) allocations and show virtual memory maps.

    The other option which I also found very usefull is to be able to dump a map of the whole virtual space based on VirtualQuery function. My code for this looks like this:

    void PrintVMMap()
    {
      size_t start = 0;
      // TODO: make portable - not compatible with /3GB, 64b OS or 64b app
      size_t end = 1U<<31; // map 32b user space only - kernel space not accessible
      SYSTEM_INFO si;
      GetSystemInfo(&si);
      size_t pageSize = si.dwPageSize;
      size_t longestFreeApp = 0;
    
      int index=0;
      for (size_t addr = start; addr<end; )
      {
        MEMORY_BASIC_INFORMATION buffer;
        SIZE_T retSize = VirtualQuery((void *)addr,&buffer,sizeof(buffer));
        if (retSize==sizeof(buffer) && buffer.RegionSize>0)
        {
          // dump information about this region
          printf(.... some buffer information here ....);
          // track longest feee region - usefull fragmentation indicator
          if (buffer.State&MEM_FREE)
          {
            if (buffer.RegionSize>longestFreeApp) longestFreeApp = buffer.RegionSize;
          }
          addr += buffer.RegionSize;
          index+= buffer.RegionSize/pageSize;
        }
        else
        {
          // always proceed
          addr += pageSize;
          index++;
        }
      }
      printf("Longest free VM region: %d",longestFreeApp);
    }