views:

1398

answers:

9

I am writing an application and am surprised to see its total memory usage is already too high. I want to profile the dynamic memory usage of my application: How many objects of each kind are there in the heap, and which functions created these objects? Also, how much memory is used by each of the object?

Is there a simple way to do this? I am working on both linux and windows, so tools of any of the platforms would suffice.

NOTE: I am not concerned with memory leaks here.

+1  A: 

In a previous job we used a tool called "Purify." It's a product made by Rational/IBM. I don't think this is a free tool, but I remember it being pretty good. Here's some info:

http://en.wikipedia.org/wiki/IBM_Rational_Purify

Andy White
+3  A: 

There are several things you can do. The simplest thing is to link a debug malloc library; there are aa number of them available, depending on the details of your environment (eg, google for _malloc_dbg for Windows.)

The second choice is that you can overload new and delete in C++; it's possible to overload the basic new and delete with new functions that track memory allocation and usage.

Charlie Martin
+2  A: 

For simple statistics, just to find out where all the memory is used, you could add a template like this:

template<class T>
class Stats {
  static int instance_count;
public:
  Stats() {
    instance_count++;
  }
  ~Stats() {
    instance_count--;
  }
  static void print() {
    std::cout << instance_count << " instances of " << typeid(T).name() <<
        ", " << sizeof(T) << " bytes each." << std::endl;
  }
};

template<class T>
int Stats<T>::instance_count = 0;

Then you can add this as a base class to the classes you suspect to have a lot of instances, and print out statistics of the current memory usage:

class A : Stats<A> {
};

void print_stats() {
  Stats<A>::print();
  Stats<B>::print();
  ...
}

This doesn't show you in which functions the objects where allocated and doesn't give too many details, but it might me enough to locate where memory is wasted.

sth
+1  A: 

You may try Memory Validator from http://www.softwareverify.com/cpp/memory/index.html

It is one of the best tools I have come across for profiling memory usage. 30 days evaluation version is available for free download.

Canopus
A: 

Just saw on AQtime site that they have a good support for "Allocation Profiling".

Amit Kumar
+1  A: 

Chapter 1.10 from Game Programming Gems Volume 2 (Amazon link) details a simple but effective Drop-in Debug Memory Manager by Peter Dalton that provides a decent set of statistics when you dump the log.

Michael Burr
+2  A: 

For windows check the functions in "crtdbg.h". crtdbg.h contains the debug version of memory allocation functions. It also contains function for detecting memory leaks, corruptions, checking the validity of heap pointers, etc.

I think following functions will be useful for you.

_CrtMemDumpStatistics _CrtMemDumpAllObjectsSince

Following MSDN link lists the Heap State Reporting functions and sample code http://msdn.microsoft.com/en-us/library/wc28wkas(VS.80).aspx

Nitin Bhide
+3  A: 

Have you tried Valgrind? It is an profiling tool for Linux. It has a memory checker (for memory leaks and other memory problems) called Memcheck but it has also a heap profiler named Massif.

fco.javier.sanz
There's even an Eclipse integration for Valgrind (http://wiki.eclipse.org/index.php/Linux_Distributions_Project)
lothar
Nice tip, I didn't know that project. I normally use Cmake so with that tool and this: http://www.vtk.org/Wiki/Eclipse_CDT4_Generator I can move all my C++ developments to Eclipse CDT in Linux, thanks.
fco.javier.sanz
A: 

Chapter 4.6 from Game Programming Gems Volume 8 (Safari Book preview link) details a advanced memory profiler by Ricky Lung which can show the allocation statistic in a hierarchical call-stack manner and yet support multi-threading.

Ricky Lung