{"id":54183,"date":"2025-11-25T16:33:46","date_gmt":"2025-11-25T16:33:46","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=54183"},"modified":"2026-02-21T08:29:08","modified_gmt":"2026-02-21T08:29:08","slug":"dotmemory-a-complete-tutorial-guide","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/dotmemory-a-complete-tutorial-guide\/","title":{"rendered":"dotMemory: A Complete Tutorial Guide dotMemory console command line tool"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"644\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/11\/image-29-1024x644.png\" alt=\"\" class=\"wp-image-54184\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/11\/image-29-1024x644.png 1024w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/11\/image-29-300x189.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/11\/image-29-768x483.png 768w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/11\/image-29.png 1292w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"309\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/11\/image-30-1024x309.png\" alt=\"\" class=\"wp-image-54187\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/11\/image-30-1024x309.png 1024w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/11\/image-30-300x91.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/11\/image-30-768x232.png 768w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/11\/image-30-1536x464.png 1536w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/11\/image-30.png 1659w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h3 class=\"wp-block-heading\"><em>A Complete Practical Guide for Memory Profiling Using Command Line<\/em><\/h3>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">1. \ud83d\udd0d <strong>What is dotMemory Console?<\/strong><\/h1>\n\n\n\n<p><strong>dotMemory Console<\/strong> (also called <strong>dotMemory Command-Line Profiler<\/strong>) is the <strong>free<\/strong>, headless version of JetBrains dotMemory that allows you to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Start .NET processes under memory profiling<\/li>\n\n\n\n<li>Attach to a running .NET process<\/li>\n\n\n\n<li>Automatically capture <strong>memory snapshots<\/strong><\/li>\n\n\n\n<li>Trigger snapshots based on conditions (timer, memory growth, process start)<\/li>\n\n\n\n<li>Profile desktop apps, web apps, Windows services, IIS, WCF services<\/li>\n\n\n\n<li>Capture snapshots on servers, CI pipelines, or production-like environments<\/li>\n<\/ul>\n\n\n\n<p>The console profiler produces <strong>snapshot (.dmw)<\/strong> files that can later be opened in the <strong>dotMemory GUI<\/strong> (paid), but <strong>everything up to taking snapshots is 100% free<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">2. \ud83c\udfaf <strong>Why Use dotMemory Console?<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">Because <strong>GUI profilers cannot run<\/strong> in many real scenarios.<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">dotMemory Console is perfect for:<\/h3>\n\n\n\n<p>\u2714 Profiling on <strong>servers<\/strong><br>\u2714 Profiling <strong>CI\/CD pipelines<\/strong><br>\u2714 Profiling <strong>performance test environments<\/strong><br>\u2714 Profiling apps running under <strong>service accounts<\/strong><br>\u2714 Profiling <strong>IIS, Kestrel, Windows services<\/strong><br>\u2714 Capturing <strong>snapshots automatically<\/strong> during load tests<br>\u2714 Capturing leaks in <strong>production-like staging<\/strong><\/p>\n\n\n\n<p>In short:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>You use dotMemory Console when you need real-world profiling without installing heavy GUI tools.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">3. \ud83e\udde0 <strong>Why Memory Profiling Matters<\/strong><\/h1>\n\n\n\n<p>Memory issues cause:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>High GC (Garbage Collection) \u2192 CPU spikes<\/li>\n\n\n\n<li>Slow response times<\/li>\n\n\n\n<li>Server crashes<\/li>\n\n\n\n<li>Out-of-memory exceptions<\/li>\n\n\n\n<li>Leaks (objects never collected)<\/li>\n\n\n\n<li>Long-lived objects blocking GC<\/li>\n\n\n\n<li>LOH (Large Object Heap) fragmentation<\/li>\n<\/ul>\n\n\n\n<p>dotMemory Console helps you <strong>capture snapshots at the EXACT moment the issue happens<\/strong>, which is not possible with GUI tools.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">4. \ud83e\udded <strong>Where dotMemory Console Can Be Used<\/strong><\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Environment<\/th><th>Supported?<\/th><\/tr><\/thead><tbody><tr><td>Windows Desktop<\/td><td>\u2714<\/td><\/tr><tr><td>Windows Server<\/td><td>\u2714<\/td><\/tr><tr><td>Linux (.NET Core)<\/td><td>\u2714<\/td><\/tr><tr><td>macOS (.NET Core)<\/td><td>\u2714<\/td><\/tr><tr><td>Docker<\/td><td>\u2714<\/td><\/tr><tr><td>Remote servers<\/td><td>\u2714<\/td><\/tr><tr><td>CI pipelines<\/td><td>\u2714<\/td><\/tr><tr><td>IIS \/ IIS Express<\/td><td>\u2714<\/td><\/tr><tr><td>Windows Services<\/td><td>\u2714<\/td><\/tr><tr><td>Console apps<\/td><td>\u2714<\/td><\/tr><tr><td>ASP.NET Core apps (Kestrel)<\/td><td>\u2714<\/td><\/tr><tr><td>Worker Services<\/td><td>\u2714<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">5. \ud83c\udfd7 <strong>How dotMemory Console Works (Internals)<\/strong><\/h1>\n\n\n\n<ol class=\"wp-block-list\">\n<li>You start profiling using commands like:\n<ul class=\"wp-block-list\">\n<li><code>dotMemory start<\/code><\/li>\n\n\n\n<li><code>dotMemory get-snapshot<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>The profiler injects into the CLR runtime.<\/li>\n\n\n\n<li>It records allocation stacks, object references, and GC behavior.<\/li>\n\n\n\n<li>When a snapshot is triggered:\n<ul class=\"wp-block-list\">\n<li>It dumps the entire managed heap.<\/li>\n\n\n\n<li>It saves it into a <code>.dmw<\/code> workspace file.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>You later open <code>.dmw<\/code> in GUI (optional) to see:\n<ul class=\"wp-block-list\">\n<li>Objects<\/li>\n\n\n\n<li>Leaks<\/li>\n\n\n\n<li>GC roots<\/li>\n\n\n\n<li>Retained memory<\/li>\n\n\n\n<li>Allocation hot paths<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">6. \ud83d\udce6 <strong>Installation (FREE)<\/strong><\/h1>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Option 1: Global Install (Recommended)<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">dotnet<\/span> <span class=\"hljs-selector-tag\">tool<\/span> <span class=\"hljs-selector-tag\">install<\/span> <span class=\"hljs-selector-tag\">--global<\/span> <span class=\"hljs-selector-tag\">JetBrains<\/span><span class=\"hljs-selector-class\">.dotMemory<\/span><span class=\"hljs-selector-class\">.Console<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Check version:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotmemory --version\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Option 2: Local Install (Project-based CI)<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">dotnet<\/span> <span class=\"hljs-selector-tag\">new<\/span> <span class=\"hljs-selector-tag\">tool-manifest<\/span>\n<span class=\"hljs-selector-tag\">dotnet<\/span> <span class=\"hljs-selector-tag\">tool<\/span> <span class=\"hljs-selector-tag\">install<\/span> <span class=\"hljs-selector-tag\">JetBrains<\/span><span class=\"hljs-selector-class\">.dotMemory<\/span><span class=\"hljs-selector-class\">.Console<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Option 3: Manual Download ZIP<\/strong><\/h2>\n\n\n\n<p>Download from JetBrains (no account needed):<br>Search <strong>\u201cJetBrains dotMemory Console download\u201d<\/strong><\/p>\n\n\n\n<p>Extract to:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-pseudo\">:toolsdotmemory<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">dotMemory<\/span><span class=\"hljs-selector-class\">.exe<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">7. \ud83e\uddf0 <strong>Features of dotMemory Console (FREE)<\/strong><\/h1>\n\n\n\n<p>\u2714 Attach to running processes<br>\u2714 Profile apps as they start<br>\u2714 Support for .NET Framework and .NET Core<br>\u2714 Automatic triggers<br>\u2714 No GUI needed<br>\u2714 Zero license cost<br>\u2714 Works on servers<br>\u2714 Snapshot packaging<br>\u2714 Works with IIS \/ Kiestrel \/ Windows Services<br>\u2714 Suitable for CI\/CD<br>\u2714 Very low overhead<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">8. \u26a1 <strong>Advantages<\/strong><\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Advantage<\/th><th>Explanation<\/th><\/tr><\/thead><tbody><tr><td>\u2714 Free<\/td><td>The full command-line profiler is FREE<\/td><\/tr><tr><td>\u2714 Works on Servers<\/td><td>No need to install big GUI tools<\/td><\/tr><tr><td>\u2714 Automation<\/td><td>Perfect for CI, load tests<\/td><\/tr><tr><td>\u2714 No IDE dependency<\/td><td>Works with any environment<\/td><\/tr><tr><td>\u2714 Supports all .NET apps<\/td><td>Desktop, web, service<\/td><\/tr><tr><td>\u2714 Trigger-based profiling<\/td><td>Catch leaks automatically<\/td><\/tr><tr><td>\u2714 Lightweight<\/td><td>Low overhead vs GUI<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">9. \u26a0 <strong>Limitations<\/strong><\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Limitation<\/th><th>Explanation<\/th><\/tr><\/thead><tbody><tr><td>\u274c No visual interface<\/td><td>Must open snapshots in GUI (paid)<\/td><\/tr><tr><td>\u274c Cannot analyze snapshots in CLI<\/td><td>You only collect snapshots<\/td><\/tr><tr><td>\u274c No real-time object graph<\/td><td>GUI required to view<\/td><\/tr><tr><td>\u274c Not ideal for beginners<\/td><td>Requires understanding of profiling<\/td><\/tr><tr><td>\u274c Some runtime-specific features require GUI<\/td><td>E.g., graph-based navigation<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">10. \ud83d\ude80 <strong>How To Use dotMemory Console (Hands-On)<\/strong><\/h1>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\u2714 <strong>10.1 Take Snapshot of Running Process<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">By process name:<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">dotMemory <span class=\"hljs-keyword\">get<\/span>-snapshot MyApp.exe --save-to-dir=C:snaps\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">By PID:<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">dotMemory <span class=\"hljs-keyword\">get<\/span>-snapshot 12564 --save-to-dir=C:snaps\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>dotMemory chooses <strong>highest-memory instance<\/strong> if multiple processes exist.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\u2714 <strong>10.2 Start App Under Profiling<\/strong><\/h1>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotMemory start --save-to-dir=C:snaps C:MyAppMyApp.exe\n<\/code><\/span><\/pre>\n\n\n<p>While app runs, you can manually trigger snapshot:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">get<\/span>-snapshot\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>OR:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Ctrl + Enter\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\u2714 <strong>10.3 Start .NET Core App (Kestrel)<\/strong><\/h1>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotMemory start-net-core --save-to-dir=C:snaps -- MyApp.dll\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\u2714 <strong>10.4 Automatic Snapshots (Memory Increase Trigger)<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">Example: snapshot when memory increases by 40%<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotMemory start --trigger-mem-inc=40% --save-to-dir=C:snaps MyApp.exe\n<\/code><\/span><\/pre>\n\n\n<p>Perfect for:<\/p>\n\n\n\n<p>\u2714 Memory leaks<br>\u2714 Load-test environments<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\u2714 <strong>10.5 Snapshots Every X Seconds<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">Every 30 seconds:<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotMemory start --trigger-timer=30s --save-to-dir=C:snaps MyApp.exe\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\u2714 <strong>10.6 At App Startup<\/strong><\/h1>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotMemory start --trigger-start --save-to-dir=C:snaps MyApp.exe\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\u2714 <strong>10.7 Profile IIS<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">Restart IIS under profiler:<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotMemory start-iis --save-to-dir=C:snaps\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Attach:<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">dotMemory <span class=\"hljs-keyword\">get<\/span>-snapshot w3wp --save-to-dir=C:snaps\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\u2714 <strong>10.8 Profile Windows Service<\/strong><\/h1>\n\n\n\n<p>Start profiling:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotMemory start-windows-service MyServiceName --save-to-dir=C:snaps\n<\/code><\/span><\/pre>\n\n\n<p>Take snapshot:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">dotMemory <span class=\"hljs-keyword\">get<\/span>-snapshot MyServiceName --save-to-dir=C:snaps\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\u2714 <strong>10.9 Profile Any Process Started Later<\/strong><\/h1>\n\n\n\n<p>Use this for \u201ccapture everything that starts now\u201d:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">dotMemory profile-<span class=\"hljs-keyword\">new<\/span>-processes --save-to-dir=C:snaps\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">11. \ud83d\udcca <strong>What To See Inside Snapshots (When Opened in GUI)<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">Once you import <code>.dmw<\/code> file into dotMemory GUI, analyze:<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Overview Page<\/strong>\n<ul class=\"wp-block-list\">\n<li>Total objects<\/li>\n\n\n\n<li>Object count growth<\/li>\n\n\n\n<li>Retained memory<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Inspections<\/strong>\n<ul class=\"wp-block-list\">\n<li>Potential leaks<\/li>\n\n\n\n<li>Types that increase<\/li>\n\n\n\n<li>Long-lived objects<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Object Sets<\/strong>\n<ul class=\"wp-block-list\">\n<li>Group by type<\/li>\n\n\n\n<li>Size and count per type<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Retention Paths<\/strong>\n<ul class=\"wp-block-list\">\n<li>Why object is not collected<\/li>\n\n\n\n<li>GC roots<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Allocations<\/strong>\n<ul class=\"wp-block-list\">\n<li>Methods causing heavy memory traffic<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Compare Snapshots<\/strong>\n<ul class=\"wp-block-list\">\n<li>Before &amp; after requests<\/li>\n\n\n\n<li>Leak tracking<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">12. \ud83e\uddea <strong>Real Use Cases<\/strong><\/h1>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\u2714 12.1 Detect Memory Leak in ASP.NET Core Under Load<\/h2>\n\n\n\n<p>Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotMemory start --trigger-mem-inc=20% --save-to-dir=C:snaps -- dotnet MyApp.dll\n<\/code><\/span><\/pre>\n\n\n<p>Start JMeter \/ k6 load test<br>\u2192 Snapshots collected \u2192 Analyze retained size differences.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\u2714 12.2 Catch Leak in Windows Service<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">dotMemory <span class=\"hljs-keyword\">get<\/span>-snapshot MyServiceName --save-to-dir=C:snaps\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Restart service \u2192 reproduce issue \u2192 compare snapshots.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\u2714 12.3 CI\/CD Pipeline Memory Regression Check<\/h2>\n\n\n\n<p>In Jenkins\/GitHub Actions:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotMemory start-net-core --trigger-mem-inc=30% --save-to-dir=snaps -- MyApp.dll\n<\/code><\/span><\/pre>\n\n\n<p>Upload snaps to artifacts.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\u2714 12.4 Taking a Snapshot Right Before Crash<\/h2>\n\n\n\n<p>Use trigger:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotMemory start --trigger-mem-inc=80% --save-to-dir=C:snaps MyApp.exe\n<\/code><\/span><\/pre>\n\n\n<p>If memory shoots up (OOM), you get snapshot automatically.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\u2714 12.5 Auto Snapshots Every X Minutes During Long-Running Tests<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotMemory start --trigger-timer=120s --save-to-dir=C:snaps MyApp.exe\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">13. \ud83d\udcc1 <strong>Snapshot Storage and Recovery<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">Save snapshots:<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">--save-to-dir=C:snaps\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">If profiling crashed:<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">dotMemory<\/span> <span class=\"hljs-selector-tag\">recover<\/span> <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-pseudo\">:snaps<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">14. \ud83e\uddfe <strong>Important Commands Cheat Sheet<\/strong><\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Purpose<\/th><th>Command<\/th><\/tr><\/thead><tbody><tr><td>Start app under profiling<\/td><td><code>start<\/code><\/td><\/tr><tr><td>Start .NET Core app<\/td><td><code>start-net-core<\/code><\/td><\/tr><tr><td>Attach to process<\/td><td><code>get-snapshot &lt;PID&gt;<\/code><\/td><\/tr><tr><td>Auto snapshot on memory growth<\/td><td><code>--trigger-mem-inc=30%<\/code><\/td><\/tr><tr><td>Auto snapshot every X seconds<\/td><td><code>--trigger-timer=20s<\/code><\/td><\/tr><tr><td>Profile IIS<\/td><td><code>start-iis<\/code><\/td><\/tr><tr><td>Profile Windows Service<\/td><td><code>start-windows-service<\/code><\/td><\/tr><tr><td>Profile processes started later<\/td><td><code>profile-new-processes<\/code><\/td><\/tr><tr><td>Save snapshots<\/td><td><code>--save-to-dir=snaps<\/code><\/td><\/tr><tr><td>Recover workspace<\/td><td><code>recover<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">15. \ud83c\udfaf <strong>Best Practices for Performance Engineers<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Always save snapshots to a separate folder<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Take a baseline snapshot<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Take snapshot after load scenario<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Always compare snapshots<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Use memory-increase triggers for leaks<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Do not profile production unless necessary<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Automate snapshot collection in CI\/CD<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Keep snapshots small by recording at correct moments<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Use GUI only for deep analysis<\/h3>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\ud83c\udf89 <strong>FINAL SUMMARY<\/strong><\/h1>\n\n\n\n<p><strong>dotMemory Console = Free, powerful, server-ready memory profiler for .NET<\/strong><br>It gives you:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Automatic snapshots<\/li>\n\n\n\n<li>Profiling of server apps<\/li>\n\n\n\n<li>Integration with performance testing<\/li>\n\n\n\n<li>100% automation via command line<\/li>\n\n\n\n<li>Ability to capture leaks exactly when they happen<\/li>\n\n\n\n<li>No need for GUI installation<\/li>\n<\/ul>\n\n\n\n<p>To analyze snapshots \u2192 you need dotMemory GUI (paid), but <strong>all profiling and snapshot generation is free.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A Complete Practical Guide for Memory Profiling Using Command Line 1. \ud83d\udd0d What is dotMemory Console? dotMemory Console (also called dotMemory Command-Line Profiler) is the free, headless version of JetBrains&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-54183","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54183","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=54183"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54183\/revisions"}],"predecessor-version":[{"id":59885,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54183\/revisions\/59885"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=54183"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=54183"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=54183"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}