[Mono-list] Heap-Shot with no GUI.

Paolo Molaro lupus at ximian.com
Thu Nov 11 11:10:06 EST 2010

On 11/05/10 Esben Laursen wrote:
> I did a install of the complete Heap-Shot and libs. I can start the
> profiling okay and I can do a "kill -PROF <pid>" and get the output file,
> however my program stalls before it comes to the part where I suspect a
> leak (also happens if I do not do a kill -PROF). It uses quite a lot of
> processes and time to load all the different settings which is normal,
> but I can see once I start my analyzer threads it stops and nothing
> happens. If I run with no --profile option it works as it should..
> Any ideas? Anyone?
> > If there are other ways to debug this problem please let me know.
> Can it be that Heap-Shot is the _only_ memory profiling tool out there
> for mono? It does not seem that stable (had a shit load of issues getting
> the GUI stuff to work)

Heap-Shot has a number of issues, since its codebase has several
dependencies on unsafe behaviour, so we have been working on a better

The new profiler is now in git and it is able to perform heapshots
when running with the sgen garbage collector.
You basically run your program with:

	mono-sgen --profile=log:heapshot yourprogram.exe

and then generate a report from the profile data with:

	mprof-report output.mlpd

To generate a heapshot roughtly every 5 seconds use:

	mono-sgen --profile=log:heapshot,hsmode=5000ms yourprogram.exe

More documentation is available here: http://www.mono-project.com/Profiler
or in the mprof-report manpage.
It should work on most linux systems and OSX, it's currently untested on

As an example, this is some of the output you can get (with mprof-report
--traces on the profile data for an asp.net app):

        Heap shot 5 at 14.518 secs: size: 43684432, object count: 562907, class count: 543
             Bytes      Count  Average Class name
          10506984      87373      120 System.Collections.Hashtable.Slot[] (bytes: +1939272, count: +16161)
                87346 references from: System.Collections.Hashtable
           8130304      87486       92 System.Int32[] (bytes: +1706912, count: +16164)
                87346 references from: System.Collections.Hashtable
                40 references from: System.Collections.Generic.Dictionary<System.String,System.Int32>
                30 references from: System.Globalization.NumberFormatInfo
           6846000      57050      120 System.Web.Caching.CacheItem (bytes: +1232880, count: +10274)
           4891432      87347       56 System.Collections.Hashtable (bytes: +904176, count: +16146)
                28526 references from: System.Web.HttpStaticObjectsCollection
                28525 references from: System.Threading.ReaderWriterLock
                28524 references from: System.Web.SessionState.SessionStateItemCollection
           1597344      28524       56 System.Web.SessionState.InProcSessionItem (bytes: +287672, count: +5137)
                28524 references from: System.Web.Caching.CacheItem
           1597344      28524       56 System.Web.SessionState.SessionStateItemCollection (bytes: +287616, count: +5136)
                28524 references from: System.Web.SessionState.InProcSessionItem

This heapshot was taken 14.518 seconds after application startup, at the
time there were 562907 objects in the heap, of 543 different types,
using about 43 MB of memory.

As the data inside parens shows, since the previous heapshot, a lot of
hash tables are kept around referenced mostly from
HttpStaticObjectsCollection, ReaderWriterLock and
SessionStateItemCollection objects.
Following the data, SessionStateItemCollection objects are kept alive by
InProcSessionItem which are themselves kept alive from CacheItem
objects. The issue here is that some cached objects are never expired
from the cache.

Hope this helps.
(Yes, someone is developing a GUI so the above data will be easier to


lupus at debian.org                                     debian/rules
lupus at ximian.com                             Monkeys do it better

More information about the Mono-list mailing list