[DUG] [computing] Re: D2007 to XE2 conversion notes

Peter Ingham ping_delphilist at 3days.co.nz
Tue Jan 17 17:09:48 NZDT 2012


On 17/01/2012 1:47 p.m., Jolyon Smith wrote:
>  > On the other hand - it looks like the same test program uses a lot less
>  > memory than the old D2007 version.    The figures vary wildly
> depending on
>
> John, none of the utilities for measuring "memory use" are actually
> reporting truly "used" memory.  The only thing that can do that is some
> utility which can interpret the information in the process heap and work
> out which memory is actually in use by the process and which memory has
> been allocated just in case it may need to be used.

If you are using an OS-level tool to measure memory usage (e.g. Task 
Manager, Process Explorer), then you need to know the meaning of the 
particular "Memory" figure you are looking at.  Unfortunately many 
people don't know what they mean and get confused by the results.

It doesn't help that the default "memory" figure under Windows Task 
Manager (a.k.a "Working Set") is usually one of the worst that can be 
used by developer (it can be heavily influenced by other processes 
running on the system to the point of being meaningless in isolation).

A much better value to use is "Private Virtual Bytes" or "Commit Size".

At the OS memory management level (for a native application), there is 
no knowledge of the existence of a heap (or heaps).  Ignoring Virtual 
Memory issues,  Memory is either allocated to a process or not.  What 
the application (or its run time libraries) do with the memory is of 
little interest.  It gets more interesting when we stop ignoring Virtual 
Memory issues and the process asks to be allocated memory, but never (or 
infrequently) accesses it.  There is unlikely to be any OS level tools 
that will tell you anything about the use of Heap memory per se.

As most modern apps do a large number of memory allocation and 
deallocation operationg (e.g. Object Create/Destroy, Temp Strings etc) - 
and usually for relatively small amounts of memory, it is usual for some 
form of internal process memory manager to be used.  Going to the OS 
every time for small chunks of memory is very slow.  Most process memory 
managers will maintain pools of memory that have been allocated by the 
OS, but are not currently being used by anything in the process.


When we know what Memory Manager (or managers) are being used within the 
process, then we may be able to come up with more accurate ideas of how 
a process is using memory.  In the case of a Java Virtual Machine or a 
.Net VM,  there is explicit knowledge of memory usage derived for some 
parts of the process when Garbage Collection is done (however for 
efficiency, modern GC techniques do not come up with definitive 
results).  Some OS level tools understand how to externally query the VM 
memory manager inside the process to obtain usage information.

FastMM4 (full version) has API calls available to dump out all memory 
blocks allocated by it, so you can compare at a detailed level what is 
being used for what (if the FastMM4 debugging options are set you can 
get details of what class a block is containing and a stack trace taken 
at the time the block was allocated).


Cheers



More information about the Delphi mailing list