{"id":54191,"date":"2025-11-25T17:26:47","date_gmt":"2025-11-25T17:26:47","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=54191"},"modified":"2026-02-21T08:29:11","modified_gmt":"2026-02-21T08:29:11","slug":"dotnet-gcdump-lightweight-net-memory-profiling-tool-advanced-tutorial","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/dotnet-gcdump-lightweight-net-memory-profiling-tool-advanced-tutorial\/","title":{"rendered":"dotnet-gcdump \u2014 lightweight .NET memory profiling tool Advanced Tutorial"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><\/h1>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">1. <strong>What is <code>dotnet-gcdump<\/code>?<\/strong><\/h1>\n\n\n\n<p><code>dotnet-gcdump<\/code> is a <strong>lightweight .NET memory profiling tool<\/strong> that collects <strong>GC (Garbage Collector) heap dumps<\/strong> with <strong>minimal performance overhead<\/strong>.<\/p>\n\n\n\n<p>It gives you:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Managed heap snapshot<\/strong><\/li>\n\n\n\n<li><strong>Objects allocation information<\/strong><\/li>\n\n\n\n<li><strong>Object types, sizes, counts<\/strong><\/li>\n\n\n\n<li><strong>Reference trees (roots, retainers)<\/strong><\/li>\n\n\n\n<li><strong>Memory pressure analysis<\/strong><\/li>\n<\/ul>\n\n\n\n<p>It is part of the .NET diagnostics toolset along with:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>dotnet-counters<\/code><\/li>\n\n\n\n<li><code>dotnet-trace<\/code><\/li>\n\n\n\n<li><code>dotnet-dump<\/code><\/li>\n\n\n\n<li><code>dotnet-monitor<\/code><\/li>\n<\/ul>\n\n\n\n<p>\ud83d\udca1 <strong>Think of dotnet-gcdump as the &#8220;lightest way&#8221; to understand memory usage without pausing\/stopping the app<\/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. <strong>Why Use <code>dotnet-gcdump<\/code>?<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Extremely low overhead<\/h3>\n\n\n\n<p>You can capture memory dumps on live production apps with <strong>almost zero impact<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Perfect for memory leak detection<\/h3>\n\n\n\n<p>It shows object types and counts to help identify:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Memory leaks<\/li>\n\n\n\n<li>Excessive retained objects<\/li>\n\n\n\n<li>High fragmentation<\/li>\n\n\n\n<li>Objects not being freed<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Works cross-platform<\/h3>\n\n\n\n<p>Runs on <strong>Windows, Linux, and macOS<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Great for comparing memory snapshots over time<\/h3>\n\n\n\n<p>Useful for before\/after deployment analysis.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">3. <strong>When to Use <code>dotnet-gcdump<\/code>?<\/strong><\/h1>\n\n\n\n<p>Use it whenever you see:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udfe1 <strong>Increasing memory usage in Production<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Memory slowly goes up \u2192 leak<\/li>\n\n\n\n<li>Too many pinned objects \u2192 fragmentation<\/li>\n\n\n\n<li>Large object heap (LOH) too high<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udfe1 <strong>GC performance issues<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>High GC frequency<\/li>\n\n\n\n<li>High fragmentation<\/li>\n\n\n\n<li>Slowness or pauses<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udfe1 <strong>Investigate specific request memory spikes<\/strong><\/h3>\n\n\n\n<p>Take a snapshot:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Before request \u2192 gcdump \u2192 After request\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udfe1 <strong>Compare two environment behaviors<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Prod vs Stage<\/li>\n\n\n\n<li>.NET version upgrade comparison<\/li>\n\n\n\n<li>New features memory comparison<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">4. <strong>How to Install <code>dotnet-gcdump<\/code><\/strong><\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">dotnet tool install --<span class=\"hljs-keyword\">global<\/span> dotnet-gcdump\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Verify:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet-gcdump --version\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\">5. <strong>How to Use <code>dotnet-gcdump<\/code><\/strong><\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">A. <strong>Find your running .NET process<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet-gcdump ps\n<\/code><\/span><\/pre>\n\n\n<p>Example output:<\/p>\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\">  5120   <span class=\"hljs-selector-tag\">MyApp<\/span><span class=\"hljs-selector-class\">.Api<\/span>\n  5566   <span class=\"hljs-selector-tag\">Orders<\/span><span class=\"hljs-selector-class\">.Web<\/span>\n  7788   <span class=\"hljs-selector-tag\">BackgroundWorker<\/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\">B. <strong>Collect a GC dump from a running process<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet-gcdump collect --process-id 5566\n<\/code><\/span><\/pre>\n\n\n<p>You will get:<\/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\">Writing<\/span> <span class=\"hljs-selector-tag\">gcdump<\/span> <span class=\"hljs-selector-tag\">to<\/span> <span class=\"hljs-selector-tag\">MyApp_20261125_142410<\/span><span class=\"hljs-selector-class\">.gcdump<\/span>\n<span class=\"hljs-selector-tag\">Complete<\/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<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">C. <strong>Collect a dump from a process that will start now<\/strong><\/h2>\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\">dotnet-gcdump<\/span> <span class=\"hljs-selector-tag\">collect<\/span> <span class=\"hljs-selector-tag\">--<\/span> <span class=\"hljs-selector-tag\">myapp<\/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<h2 class=\"wp-block-heading\">D. <strong>Specify output file<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet-gcdump collect --process-id 5566 --output \/tmp\/myapp-leak.gcdump\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\">6. <strong>How to Analyze a GCDump<\/strong><\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u2714 Best tool: <strong>PerfView<\/strong><\/h2>\n\n\n\n<p>(Microsoft official memory analysis tool)<\/p>\n\n\n\n<p>Open PerfView \u2192<br><strong>File \u2192 Open \u2192 .gcdump file<\/strong><\/p>\n\n\n\n<p>You will see:<\/p>\n\n\n\n<p>You can inspect:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Heap Size<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Object Types<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Count &amp; Size<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Roots<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Retention Graph<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Diff View (compare two dumps)<\/h3>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">7. <strong>Important Metrics in a GC Dump<\/strong><\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Metric<\/th><th>Meaning<\/th><th>Why Important<\/th><\/tr><\/thead><tbody><tr><td><strong>Total Heap Size<\/strong><\/td><td>Total memory used by managed heap<\/td><td>Detect memory bloat<\/td><\/tr><tr><td><strong>Gen 0\/1\/2 Size<\/strong><\/td><td>Memory per generation<\/td><td>Shows GC pressure<\/td><\/tr><tr><td><strong>LOH (Large Object Heap)<\/strong><\/td><td>Objects &gt; 85 KB<\/td><td>High LOH = fragmentation risk<\/td><\/tr><tr><td><strong>Pinned Objects<\/strong><\/td><td>Objects fixed in memory<\/td><td>Affects GC performance<\/td><\/tr><tr><td><strong>Object Count<\/strong><\/td><td>How many objects of each type<\/td><td>Shows leaks (e.g., growing list)<\/td><\/tr><tr><td><strong>Retainers \/ Roots<\/strong><\/td><td>What is holding objects alive<\/td><td>Critical for leak detection<\/td><\/tr><tr><td><strong>Diff View<\/strong><\/td><td>Compare two snapshots<\/td><td>Identifies what grew<\/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\">8. <strong>Common Memory Issues Detected via GCDump<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd25 <strong>Memory Leaks<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Singleton holding references<\/li>\n\n\n\n<li>Event handlers not unsubscribed<\/li>\n\n\n\n<li>Static lists growing<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd25 <strong>Large Object Heap Pressure<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Large arrays<\/li>\n\n\n\n<li>Images \/ byte[]<\/li>\n\n\n\n<li>Serialization buffers<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd25 <strong>Excessive Allocation<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Chatty LINQ<\/li>\n\n\n\n<li>Unoptimized JSON serialization<\/li>\n\n\n\n<li>Inefficient loops<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd25 <strong>Pinned Objects Issues<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GPU buffers<\/li>\n\n\n\n<li>Unsafe code<\/li>\n\n\n\n<li>Interop<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">9. <strong>Advanced Usage<\/strong><\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">A. Collect after forcing GC (for cleaner dump)<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet-gcdump collect --process-id 5566 --gc-collect\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">B. Collect for a process name (not PID)<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">dotnet-gcdump<\/span> <span class=\"hljs-selector-tag\">collect<\/span> <span class=\"hljs-selector-tag\">--name<\/span> <span class=\"hljs-selector-tag\">Orders<\/span><span class=\"hljs-selector-class\">.Api<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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\">10. <strong>Advantages of <code>dotnet-gcdump<\/code><\/strong><\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Benefit<\/th><\/tr><\/thead><tbody><tr><td>Lightweight<\/td><td>Safe in production<\/td><\/tr><tr><td>Zero-impact on performance<\/td><td>Unlike full dump<\/td><\/tr><tr><td>Easy to automate<\/td><td>CI, cron, scripts<\/td><\/tr><tr><td>Cross-platform<\/td><td>Works everywhere<\/td><\/tr><tr><td>Works with PerfView<\/td><td>Powerful analysis UI<\/td><\/tr><tr><td>Can compare snapshots<\/td><td>Detect leaks precisely<\/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\">11. <strong>Limitations of <code>dotnet-gcdump<\/code><\/strong><\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Limitation<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>Cannot debug code execution<\/td><td>Use dotnet-trace<\/td><\/tr><tr><td>Only managed heap<\/td><td>No native memory<\/td><\/tr><tr><td>Limited call stacks<\/td><td>Not full session trace<\/td><\/tr><tr><td>No CPU profiling<\/td><td>Use dotnet-trace<\/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\">12. <strong>Best Practices<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">\u2b50 Capture multiple dumps<\/h3>\n\n\n\n<p>Before, during, after load test.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2b50 Always analyze with PerfView<\/h3>\n\n\n\n<p>It is the official recommended tool.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2b50 Automate weekly GC dumps in production<\/h3>\n\n\n\n<p>Useful for long-running apps.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2b50 Combine with <code>dotnet-counters<\/code><\/h3>\n\n\n\n<p>To monitor GC in real-time.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\u2705 <strong>1. Basic Example \u2014 Capture a GC Dump from a Running Process<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1 \u2014 List running .NET processes<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet-gcdump ps\n<\/code><\/span><\/pre>\n\n\n<p><strong>Example Output:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">  5120   <span class=\"hljs-selector-tag\">Orders<\/span><span class=\"hljs-selector-class\">.Api<\/span>\n  5566   <span class=\"hljs-selector-tag\">LoginService<\/span>\n  7788   <span class=\"hljs-selector-tag\">BackgroundWorker<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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<h3 class=\"wp-block-heading\">Step 2 \u2014 Capture a GC dump from PID 5120<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet-gcdump collect --process-id 5120\n<\/code><\/span><\/pre>\n\n\n<p><strong>Output Example:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Writing<\/span> <span class=\"hljs-selector-tag\">gcdump<\/span> <span class=\"hljs-selector-tag\">to<\/span> <span class=\"hljs-selector-tag\">OrdersApi_20261125_141800<\/span><span class=\"hljs-selector-class\">.gcdump<\/span>...\n<span class=\"hljs-selector-tag\">Complete<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><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>\ud83d\udc49 This creates a file like:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">OrdersApi_20261125_141800<\/span><span class=\"hljs-selector-class\">.gcdump<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><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\">\u2705 <strong>2. Example \u2014 Capture Dump of a Process by Name<\/strong><\/h1>\n\n\n\n<p>If you don\u2019t want to use PID:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">dotnet-gcdump<\/span> <span class=\"hljs-selector-tag\">collect<\/span> <span class=\"hljs-selector-tag\">--name<\/span> <span class=\"hljs-selector-tag\">Orders<\/span><span class=\"hljs-selector-class\">.Api<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><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>Output:<\/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\">Found process <span class=\"hljs-string\">'Orders.Api'<\/span> (PID <span class=\"hljs-number\">5120<\/span>)\nWriting gcdump...\nComplete\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\">\u2705 <strong>3. Example \u2014 Capture Dump and Save to Custom Path<\/strong><\/h1>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet-gcdump collect \n  --process-id 5566 \n  --output \/logs\/memory\/Leak_5566_2PM.gcdump\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\">\u2705 <strong>4. Example \u2014 Collect After Forcing a Full GC<\/strong><\/h1>\n\n\n\n<p>Useful when you want a clean snapshot:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet-gcdump collect --process-id 5566 --gc-collect\n<\/code><\/span><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Forcing full garbage collection...\nDumping managed heap...\nSuccess\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\">\u2705 <strong>5. Example \u2014 Capture GCDump When Running a Command<\/strong><\/h1>\n\n\n\n<p>Run your app and immediately collect:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">dotnet-gcdump<\/span> <span class=\"hljs-selector-tag\">collect<\/span> <span class=\"hljs-selector-tag\">--<\/span> <span class=\"hljs-selector-tag\">dotnet<\/span> <span class=\"hljs-selector-tag\">run<\/span> <span class=\"hljs-selector-tag\">--project<\/span> <span class=\"hljs-selector-tag\">MyApp<\/span><span class=\"hljs-selector-class\">.Api<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><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>This starts <code>MyApp.Api<\/code>, collects dump, and exits.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\u2705 <strong>6. Example \u2014 Compare Two GCDumps (using PerfView)<\/strong><\/h1>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Take two dumps: <code>dotnet-gcdump collect --process-id 5120 --output baseline.gcdump dotnet-gcdump collect --process-id 5120 --output after_load.gcdump<\/code><\/li>\n\n\n\n<li>Open <strong>PerfView<\/strong> \u2192 <strong>Diff<\/strong><\/li>\n\n\n\n<li>Select both dumps \u2192 Analyze differences.<\/li>\n<\/ol>\n\n\n\n<p>PerfView will show:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Object growth<\/li>\n\n\n\n<li>Memory leaks<\/li>\n\n\n\n<li>Which objects increased or decreased<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\ude80 <strong>Real Production-like Examples<\/strong><\/h1>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Example 7 \u2014 Detect Memory Leak in ASP.NET Core App<\/strong><\/h2>\n\n\n\n<p>You see memory keeps increasing in production.<br>Take a gcdump:<\/p>\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\">dotnet-gcdump<\/span> <span class=\"hljs-selector-tag\">collect<\/span> <span class=\"hljs-selector-tag\">--process-id<\/span> 44312 <span class=\"hljs-selector-tag\">--output<\/span> <span class=\"hljs-selector-tag\">before_load<\/span><span class=\"hljs-selector-class\">.gcdump<\/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<p>Run a heavy load test for 10 minutes\u2026<\/p>\n\n\n\n<p>Take second dump:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">dotnet-gcdump<\/span> <span class=\"hljs-selector-tag\">collect<\/span> <span class=\"hljs-selector-tag\">--process-id<\/span> 44312 <span class=\"hljs-selector-tag\">--output<\/span> <span class=\"hljs-selector-tag\">after_load<\/span><span class=\"hljs-selector-class\">.gcdump<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><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>Analyze diff:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>List&lt;SessionObject&gt;<\/code> grew by +120,000 objects<\/li>\n\n\n\n<li><code>byte[]<\/code> objects in LOH increased<\/li>\n\n\n\n<li>Some static dictionary retained references<\/li>\n<\/ul>\n\n\n\n<p>Result \u2192 <strong>Memory leak confirmed<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Example 8 \u2014 Identify Large Object Heap (LOH) Pressure<\/strong><\/h2>\n\n\n\n<p>App is slow. Using gcdump:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet-gcdump collect --process-id 5566\n<\/code><\/span><\/pre>\n\n\n<p>PerfView shows:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>LOH: <strong>600 MB<\/strong><\/li>\n\n\n\n<li>Large arrays: byte[] of sizes 1 MB each<\/li>\n\n\n\n<li>Created during image resizing logic<\/li>\n<\/ul>\n\n\n\n<p>Solution:<br>Switch to <strong>shared buffers<\/strong>, or <strong>pooling<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Example 9 \u2014 High Allocation Rate Investigation<\/strong><\/h2>\n\n\n\n<p><code>dotnet-counters<\/code> shows <strong>Allocation Rate 800 MB\/sec<\/strong>.<\/p>\n\n\n\n<p>Take gc-dump:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">dotnet-gcdump<\/span> <span class=\"hljs-selector-tag\">collect<\/span> <span class=\"hljs-selector-tag\">--process-id<\/span> 6632 <span class=\"hljs-selector-tag\">--output<\/span> <span class=\"hljs-selector-tag\">high_alloc<\/span><span class=\"hljs-selector-class\">.gcdump<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><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>PerfView:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Huge number of <code>JObject<\/code> and <code>JToken<\/code><\/li>\n\n\n\n<li>Caused by unoptimized JSON-parsing inside loop<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\ud83e\uddea <strong>Sample GCDump File Name Examples<\/strong><\/h1>\n\n\n\n<p>Dump filenames generated automatically:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">OrdersApi_20261125_091000<\/span><span class=\"hljs-selector-class\">.gcdump<\/span>\n<span class=\"hljs-selector-tag\">PaymentService_20261125_152200<\/span><span class=\"hljs-selector-class\">.gcdump<\/span>\n<span class=\"hljs-selector-tag\">BackgroundWorker_20261126_004500<\/span><span class=\"hljs-selector-class\">.gcdump<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><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\">\ud83d\udcc4 <strong>Sample dotnet-gcdump Output (Realistic)<\/strong><\/h1>\n\n\n\n<p>Example console output when capturing:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">PS&gt; dotnet-gcdump collect --process-id <span class=\"hljs-number\">5566<\/span> --output api-memory-dump.gcdump\n\n<span class=\"hljs-attr\">StartTime<\/span>:       <span class=\"hljs-number\">2026<\/span><span class=\"hljs-number\">-11<\/span><span class=\"hljs-number\">-25<\/span>T14:<span class=\"hljs-number\">15<\/span>:<span class=\"hljs-number\">03.123<\/span>Z\nProcess Name:    Orders.Api\n<span class=\"hljs-attr\">PID<\/span>:             <span class=\"hljs-number\">5566<\/span>\nGC Mode:         Server GC\nCollecting...\nWriting gcdump to <span class=\"hljs-string\">'api-memory-dump.gcdump'<\/span>...\nComplete\nDump Size:       <span class=\"hljs-number\">85.32<\/span> MB\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><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\">\ud83d\udd0d <strong>Example PerfView Analysis (What You See)<\/strong><\/h1>\n\n\n\n<p>Once opened in PerfView, you may see:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Heap Summary<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Total Heap: <strong>1.2 GB<\/strong><\/li>\n\n\n\n<li>Gen 0: 120 MB<\/li>\n\n\n\n<li>Gen 1: 80 MB<\/li>\n\n\n\n<li>Gen 2: 350 MB<\/li>\n\n\n\n<li>LOH: 650 MB<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Top Object Types by Size<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Type<\/th><th>Count<\/th><th>Size<\/th><\/tr><\/thead><tbody><tr><td>byte[]<\/td><td>2,450<\/td><td>420 MB<\/td><\/tr><tr><td>JObject<\/td><td>50,000<\/td><td>200 MB<\/td><\/tr><tr><td>Dictionary&lt;string, object&gt;<\/td><td>8,000<\/td><td>130 MB<\/td><\/tr><tr><td>String<\/td><td>450,000<\/td><td>80 MB<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u2714 Retention Graph<\/h3>\n\n\n\n<p>You will see:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Static<\/span>: <span class=\"hljs-selector-tag\">SomeCache<\/span>\n \u2514\u2500\u2500 <span class=\"hljs-selector-tag\">Dictionary<\/span>&lt;<span class=\"hljs-selector-tag\">string<\/span>, <span class=\"hljs-selector-tag\">object<\/span>&gt;\n       \u2514\u2500\u2500 <span class=\"hljs-selector-tag\">DataObject<\/span><span class=\"hljs-selector-attr\">&#91;]<\/span>\n             \u2514\u2500\u2500 <span class=\"hljs-selector-tag\">byte<\/span><span class=\"hljs-selector-attr\">&#91;]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><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>This tells you what is <strong>keeping objects alive<\/strong> \u2192 leak root.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\ud83c\udfaf <strong>Want me to generate a sample <code>.gcdump<\/code> file for training?<\/strong><\/h1>\n\n\n\n<p>I can generate:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Fake GC dump<\/li>\n\n\n\n<li>PerfView screenshots<\/li>\n\n\n\n<li>Step-by-step lab manual<\/li>\n\n\n\n<li>PPT (PowerPoint) 10\u201315 slides<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. What is dotnet-gcdump? dotnet-gcdump is a lightweight .NET memory profiling tool that collects GC (Garbage Collector) heap dumps with minimal performance overhead. It gives you: It is part of&#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-54191","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54191","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=54191"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54191\/revisions"}],"predecessor-version":[{"id":59887,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54191\/revisions\/59887"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=54191"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=54191"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=54191"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}