Why do You Need a Memory Profiler for a Garbage Collected Runtime?
Having a garbage collected runtime removes one of the
biggest sources of program errors, memory allocation errors. You no longer have
to worry about freeing memory which you no longer use, and there is no risk that
you use memory after it has been freed. Unfortunately, memory leaks are still a
reality. A memory leak can occur if an instance is unintentionally being
referenced
from some other long-living instance, or from a static field.
In this case the instance cannot be garbage collected. A very common unintentional reference is an event
handler that is never removed.
.NET Memory Profiler can help you locate instances that
are being referenced unintentionally, and it will tell you why the instance has
not been garbage collected.
Additionally, the only resource the garbage collector is
aware of is memory managed by the runtime. Unmanaged resources like file
handles, database connections, bitmaps etc. are not handled well by the garbage
collector. The runtime provides a mechanism called Finalization, which can be
used to clean-up unmanaged resources. However, finalization is an expensive
feature and the clean-up is not
deterministic; the clean-up can
happen any time after an instance is no longer reachable. To solve the problem with
cleaning up unmanaged resources, the Dispose pattern was introduced. The Dispose
pattern allows (or rather demands) the user to dispose the instance explicitly.
The dispose tracker feature of .NET Memory Profiler
helps you to make sure that all disposable instances are correctly disposed.
Finally, to optimize the
performance of the garbage collector, certain assumptions have been made on the
way instances are allocated. If a program allocates memory in a way that is not
suitable for the garbage collector, then performance of the garbage collector
will suffer, and the memory overhead will be bigger.
By using the real-time view of .NET Memory Profiler, it is
possible to get an understanding on how well the allocations in the program
correspond with the assumptions made by the garbage collector.