What's New in dotMemory
.NET 7 support
dotMemory now lets you profile .NET 7 applications on Windows, macOS, and Linux.
Note that you might face the following issues:
If your application creates dynamic assemblies, the profiler won't show data (method names and object types) from these assemblies. They will be shown as Unresolved.
If you profile the application by attaching the profiler to it, the application may crash during the session.
Both issues will be fixed in the upcoming .NET 7 bugfix release.
Improved ARM CPUs support
Linux arm32 – Now, you can run the dotMemory command-line profiler on arm32 CPUs on Linux. Supported frameworks: .NET Core 3.1, .NET 5.0 - 7.0.
Windows arm64 – Now, you can use dotMemory on arm64 CPUs on Windows. This applies to all versions: dotMemory standalone, dotMemory in Rider, dotMemory in Visual Studio, and the dotMemory command-line tool.
dotMemory in JetBrains Rider on Linux and macOS
In addition to Windows, dotMemory is now available for JetBrains Rider on Linux and macOS:
Two new profiling modes are available in the Run widget and in the Run | Switch profiler configurations menu – Memory (sampled allocations) and Memory (full allocations).
Attach the profiler to a running process from the Run menu.
Watch the Timeline graph unroll in real time. Select an interval and open the Memory Allocations view. It is equal to the same view in dotMemory Standalone and lets you analyze allocated objects and the allocation call tree for a specific time frame.
Note that collecting memory snapshots is not available in this version.
Improvements in the dotMemory command-line profiler
The command-line profiler gets the
--saving-modeargument that lets you set conditions on when to save a dotMemory workspace.
always– (default) save the workspace after the profiling session is finished
has-snapshot– save the workspace on session finish only if the workspace contains at least one snapshot
postpone– save the workspace only on session finish only if the stdin message
## dotMemory["confirm-save"]was received
dotMemory in JetBrains Rider
dotMemory is now available in the JetBrains Rider IDE:
Two new profiling modes are available in the Run widget and in Run | Switch profiler configurations in the main menu – Memory (sampled allocations) and Memory (full allocations).
Attach the profiler to a running process from the Run menu.
Watch the Timeline Graph unroll in real-time. Select an interval and open the Memory Allocations view. It is equal to the same view in dotMemory Standalone and lets you analyze allocated objects and the allocation call tree for a specific time frame.
dotMemory in Rider doesn't allow collecting snapshots in the 2022.2 version.
The dotMemory command-line tool now supports Alpine versions 3.13–3.15. The following CPUs and frameworks are supported:
x64: .NET Core 3.1, .NET 5.0–6.0.
arm64: .NET 5.0–6.0.
You can now attach the profiler to an already running application by simply dragging the special icon onto the application window.
When getting a snapshot with the help of the profiling API, you can now specify a snapshot name using
DotMemory.GetSnapshot("snapshot name");The name will be shown on the dotMemory Home | Snapshots page.
The Similar Retention view now processes data much faster.
The dotMemory command-line tool now shows its progress when saving a snapshot.
Suppose you profile a root process that creates a number of managed child processes you want to profile. The root process itself is excluded from profiling for some reason (for example, it may be a shell script, a native process, or you simply exclude it with process filters).
Before: The profiler starts profiling any child process that matches the filter. Once a child process is finished, the profiler waits for one second. If no new child processes are started within this time, the profiler finishes the profiling session. This could be a problem if the root process starts child processes with a longer delay.
Now: While the root process is running, the profiler doesn't stop the profiling session. Once the root process stops working, the profiler switches to the one-second-delay approach. (edited)
.NET 6 support
dotMemory now lets you profile .NET 6 applications on Windows, macOS, and Linux. Note that to profile applications on Linux and macOS, you should use dotMemory command-line profiler.
Support for Apple M1
Now, the dotMemory command-line tool can work on computers with Apple M1 processors. The tool supports profiling of .NET 6 applications (native mode) and .NET 5 applications (Rosetta 2 mode).
Now, dotMemory can get sampled data about memory allocation based on ETW events. Compared to the traditional (statistical) way of collecting allocation data, sampling is less detailed but provides a number of advantages: The sampled allocation data is collected without performance penalties. You don't need to enable collecting this data explicitly, it is always turned on. Sampled allocation data can be also collected when you attach the profiler to an already running application. Note that this feature is available only on Windows.
Now, you can analyze memory allocation data using the Subsystems view. A subsystem groups all methods belonging to the same type, namespace, or assembly. The resulting view shows objects created by the subsystems and a merged call tree for each subsystem.
We completely reworked the algorithm behind the dominators tree (the object retention graph). Even if an object set contains hundreds of millions of objects, dotMemory will open a particular view in a couple of minutes.
In this release, we continue improving the way you analyze memory allocation. The Memory Allocation view gets two additional dimensions:
Methods lets you analyze the plain list of methods that allocated memory.
Call Tree lets you analyze the allocation call tree. Each node in the tree shows not only the called method but also objects allocated by the call.
View filters (a search bar on top of dotMemory views) become more flexible and clear:
The filters get additional options to narrow the search scope:
#struct(search only in value types),
#c(only in types),
#m(only in methods),
#ns(only in namespaces).
You can get built-in help for all filters possible in the current context.
Now, it's possible to:
Specify traverse depth when exporting object data.
Select one or more types and export these data to a single file.
Export object data from the Instances, Outgoing References, and Unreachable Objects views.
Console profiler: Now, it's possible to enable/disable collecting memory allocation data with service messages.
Stack trace copied to clipboard in dotMemory is now automatically opened in Rider / Visual Studio with ReSharper.
Various bug fixes.
We completely reworked the dotTrace Home screen. Now, it's much easier to configure and start new profiling sessions, work with workspaces, and perform other basic operations.
Now, you can analyze dumps of .NET Core applications collected on the Linux systems using
Now, dotMemory lets you analyze memory allocation on an arbitrary time interval. Just select the interval on the timeline and the Memory Allocation view will show you the objects allocated on this interval as well as the stack trace that allocated them.
.NET 5 support
dotMemory now lets you profile .NET 5 applications on Windows, macOS, and Linux. Note that to profile applications on Linux and macOS, you should use dotMemory command-line profiler.
dotMemory uses the timeline data to provide automatic inspections right on the Timeline graph. Currently, there are three inspections available:
High Garbage Collection pressure
Pinned objects in Gen0
Fast Large Objects Heap growth rate
.NET 5 introduced a separate heap segment for storing pinned objects - objects that cannot be moved in a heap which leads to heap fragmentation. dotMemory shows the Pinned Object Heap in the Heap Fragmentation View. Also, now dotMemory shows memory allocated to the Pinned Object Heap in real-time during profiling.
Various timeline improvements
Garbage collections are shown on a separate graph below the main timeline.
Now, you can select a particular time range on the timeline: The information about GC time and allocated memory will be shown for the selected time range.
The dotMemory command-line profiler gets support for Linux and macOS.
The dotMemory command-line profiler for Linux (any distribution with GLIBC_2.23 or later) lets you profile applications on ARM64 systems.
You can open pinned objects as a separate object set.
You can open objects that are not reachable from GC roots as a separate object set.
Bug fixes and stability improvements.
Note that we also reworked internal data format. This means that dotMemory 2020.1 snapshot format is incompatible with earlier versions. At the same time, this will let us introduce some new features in the future releases.
The new self-profiling API.
The self-profiling API (the API that lets applications initialize and start a profiling session by themselves) becomes more convenient and easy-to-use. The self-profiling API is distributed as a NuGet package.
Ability to export instance details to a .json file (.bson, .hex, and .txt are also available).
You can now view a virtual memory address of an object instance.
dotMemory console profiler improvements.
dotMemory 2019.2 stops supporting remote profiling. To offer you an adequate replacement, we significantly improved the dotMemory console profiler:
The console profiler is almost equal to the standalone dotMemory. You can use the console tool to get snapshots of:
.NET Core applications,
IIS Express-hosted applications,
WCF service libraries,
or any .NET application that is started after you run a profiling session.
Now, the console profiler can take a memory snapshot right after this becomes possible. This feature can be helpful in case you want to take a baseline snapshot and use it for comparison.
On-demand snapshot processing.
You can start working with a snapshot without waiting until the data is fully processed.
.NET Core 3.0 full support.
dotMemory is now able to attach to .NET Core 3.0 Preview 7 processes.
Improved support for ASP.NET Core applications in Visual Studio:
different hosting models are correctly supported,
browser settings and Enable SSL are taken into account when starting a profiling session,
ASP.NET Core 3.0 Preview 7 is supported,
and other improvements...
Profiling API gets the ability to detach from the profiled process.
Silverlight and WebDev applications are no longer supported.
.NET Core 3.0 applications support.
New profiling API. We have significantly updated the profiling API:
we have removed the state machine. Now, you can call any API method regardless of the controller state.
we have reduced the number of available methods, thereby simplifying the use of the API.
now, we distribute the API as a NuGet package.
Improved navigation to type declaration. Now, the 'navigate to type declaration' action is able to navigate you not only to Visual Studio but to JetBrains Rider as well.
Improved getting snapshots by condition. The profiling controller gets a new condition for taking a snapshot: Get a snapshot if total memory usage exceeds X MB.
Improved timeline graph. Click the graph to get exact memory data at a specific time point.
Reworked IIS Express profiling settings. Now, the default way to profile a web app hosted on IIS Express is to provide dotMemory a
Profiling of run configurations. dotMemory integrated in Visual Studio gets more profiling capabilities. Now, you can profile not only your startup project, but any 'run configuration' - a startup project, an arbitrary executable, or even any static method.
The timeline is now available for all types of applications including .NET Core, ASP.NET Core, IIS-hosted web apps, and others.
The timeline contains a new Allocated in LOH since GC chart. The chart shows instant memory allocation to the Large Object Heap and can be very helpful in detecting excessive allocations of large objects.
Now, the Finalizable objects inspection works not only with snapshots captured via dotMemory but with raw memory dumps as well. In addition, now, finalizable objects are treated as objects that exist in a snapshot/dump, so you can open them and inspect more thoroughly.
Two new root types: F-Reachable Queue / Finalization Queue.
dotMemory console runner allows you to set a name for a taken snapshot.
Improved user interface. The 2018.1 release brings multiple minor user interface improvements. The most significant change is the reworked Analysis Subject panel. Now, it's much easier to navigate your analysis path.
Improved search. Now, when searching for particular objects in object set views, you can make your search more efficient by using special symbols.
Import memory dumps. Now, you can import Windows raw memory dumps (typically, you get them using the Task Manager or Process Explorer tools) and analyze them using all the power of dotMemory.
Improved 'Group by Dominators' view. The Group by Dominators view was reworked to make it easier to understand what are the key objects in your application. The tree of dominators is now combined with the dominators sunburst chart.
Improved user interface. The dotMemory user interface was slightly redesigned to make navigation through analysis subjects and views easier. The additional benefit of this work is the increased views area.
Command-line profiler. dotMemory 2017.1 includes the dotMemory.exe tool that allows you to profile from the command line. The tool is extremely helpful when you need to automate the process of gathering memory snapshots.
Compare snapshots from different sessions. dotMemory allows you to compare memory snapshots stored in different workspaces: that is, collected in different profiling sessions.
Navigate through view history.
dotMemory Home view.
dotMemory receives a Home view similar to that available in recent versions of dotTrace.