NopCommerce High Memory Usage Fix

NopCommerce High Memory Usage: How to Diagnose and Fix It

A practical, field-tested guide to finding what's really eating your store's memory — and the exact settings that fix it for good.

BS
BSS Team
nopCommerce Performance Specialists
NopCommerce high memory usage: how to diagnose and fix it

If your NopCommerce store is eating through RAM, restarting every 30–60 minutes, or getting flagged by your host for "excessive memory usage," you're not imagining things — and you're not alone. We've pulled this exact issue apart on client stores running everything from nopCommerce 4.1 to 4.70, and the honest answer is: it's almost never a single bug. It's usually one (or two) of four very specific, very fixable causes.

This guide walks through how to actually diagnose what's eating your memory, not just guess and "throw more RAM at it." We'll show you the real numbers we've seen on live stores, the exact settings to check, and what to do once you know the cause.

Why NopCommerce Uses More Memory Than You'd Expect

Key Fact: A fresh nopCommerce install with no plugins and almost no traffic can still use 150–300 MB of RAM just to stay running. That's normal for an ASP.NET Core application — it's not a leak.

The problem starts when that number climbs into the 600 MB–1.5 GB range, or when memory never comes back down after traffic drops off, or when your application pool keeps recycling because it hit a memory ceiling set by your host.

There's a real, well-documented history here. Back in nopCommerce 4.10, the official team itself reported instances running 3–5x more memory than expected — in one case a single store process held onto 1.3 GB. That issue had a known cause and a known fix, and it's a useful case study because the same diagnostic logic applies to almost every high-memory case we've seen since, regardless of version.

Step 1: Confirm What You're Actually Looking At

Don't jump straight to "fix mode." First figure out which of these three patterns you're dealing with, because each one points to a completely different cause.

Spike & Settle
Memory spikes right after a restart, then settles down. Usually normal when IIS recycles your app pool.
Steady Climb
Memory climbs steadily and never comes back down. Points to a memory leak or Server GC configuration issue.
High Baseline
Memory is consistently higher than it should be for your traffic level. Usually traces to Server GC mode or caching issues.
Three common memory usage patterns in NopCommerce applications
Figure 1: Three common memory usage patterns. Identifying which one matches your situation is the first diagnostic step.

Open Task Manager (Windows) or your hosting panel's resource monitor, restart the app, and watch the curve for 10–15 minutes under light, normal use. Which pattern matches what you're seeing? That tells you where to look next.

Step 2: Diagnose the Root Cause

Now that you know which pattern you're dealing with, let's identify the specific cause. We've found that 70% of high-memory issues trace back to just four factors.

Cause 1: Server Garbage Collection Mode

This is, by a wide margin, the most common cause we encounter — and it's the one the nopCommerce team itself identified and patched into later versions after their own demo servers (45 stores on one box) hit 100% memory and CPU.

.NET has two garbage collector modes:

  • Server GC — optimized for throughput on multi-core servers. It allocates a separate heap per CPU core, which means more cores equals proportionally more memory reserved, regardless of how much traffic you're actually getting.
  • Workstation GC — designed for lighter, single-core-friendly workloads. It collects more frequently with smaller memory footprint, at a small cost to raw throughput.
Comparison of Server GC and Workstation GC memory allocation strategies
Figure 2: Server GC reserves memory per CPU core, while Workstation GC uses a single, efficient heap. For low-to-mid traffic stores, Workstation GC can reduce memory usage by 40–60%.

The Catch That Catches People Off Guard

Server GC is the default for ASP.NET Core apps running on a server OS. If you're hosting a single nopCommerce store (or several lower-traffic stores) on a multi-core VPS, Server GC will reserve memory proportional to your core count — not your actual traffic. An 8-core server running Server GC can easily reserve 2–4x the memory a Workstation GC setup would use for the exact same store, with no meaningful difference in real-world speed for a typical small-to-mid traffic store.

How to Check:

Open appsettings.json or look for a [YourApp].runtimeconfig.json file in your published output and check for:

"configProperties": {
  "System.GC.Server": true
}

If this is true and you're running a modest-traffic store, this is very likely contributing to your problem.

Cause 2: 32-bit vs 64-bit Application Pool

This one is less talked about but, in our experience, just as impactful as GC mode — and the two compound each other.

NopCommerce's own team documented that switching a demo store from 64-bit to 32-bit application pool mode cut memory usage roughly in half, with no noticeable performance loss for typical store traffic. Across more than 30 of their own demo stores, this brought average memory down to 200–300 MB per site.

Cause 3: Plugin and Theme Bloat

Every installed plugin adds DLLs that get loaded into memory at startup — and not just the active ones. We've personally traced memory issues on client stores back to plugins that were installed but not even enabled, because the assembly was still sitting in the /Plugins folder and getting picked up.

Cause 4: Database Size and Missing Caching

A growing product catalog without proper caching configured will pull progressively more data into memory on every request that touches it — category pages, search, and filtered navigation are the usual suspects.

Step 3: Apply the Fix

Once you've identified the cause, here's exactly what to do:

Cause Fix Expected Impact
Server GC reserving too much Set System.GC.Server to false in your runtime config, or add <ServerGarbageCollection>false</ServerGarbageCollection> to your .csproj before publishing Can cut baseline memory by 40–60%
64-bit app pool overhead Switch app pool to 32-bit (Enable 32-Bit Applications = True) in IIS, republish as x86 if needed Roughly 50% reduction
Plugin/theme bloat Remove unused plugin folders entirely (not just disable), audit theme-bundled widgets for heavy AJAX components Varies widely — we've seen single plugins responsible for 200MB+
Catalog without caching Enable distributed caching (Redis) for multi-server setups, or verify standard output caching is active Reduces sustained growth under load

When You Need Professional Help

If you've checked GC mode, bitness, and plugins and memory is still climbing without bound, you're likely looking at a genuine leak rather than a configuration issue. This is rare, but it does happen, particularly with custom-built plugins that hold references to DbContext instances longer than they should.

What We've Actually Seen Across Client Stores

We work hands-on with nopCommerce theme and plugin deployments daily at BSS, and the pattern holds up consistently: stores coming to us with "high memory" complaints are running Server GC by default (because almost nobody changes this setting — it's not something the standard install prompts you to configure), and 7 times out of 10, that single change combined with confirming 32-bit app pool mode brings memory down into a sane range without touching a single plugin.

The remaining cases are almost always one specific plugin that's poorly optimized — and it's rarely the one the store owner suspects first. We've learned not to assume; profiling beats guessing every time.

The numbers from the official nopCommerce team's own testing back this up well: their demo environment went from struggling at 100% memory and CPU across 45 stores to running comfortably after the GC mode change alone — and that was before they even touched bitness or plugin audits.

Preventing This Going Forward

A short checklist worth running quarterly, not just when something breaks:

Quarterly Memory Optimization Checklist

  • Re-check GC mode and app pool bitness after every major nopCommerce upgrade — settings can reset or behave differently between versions
  • Remove plugin folders for anything genuinely unused, rather than leaving them disabled indefinitely
  • Monitor baseline memory (not just peak) so you notice gradual creep before it becomes a crisis
  • If your catalog has grown significantly since launch, revisit your caching configuration — what was fine at 500 products may not be fine at 5,000

When It's Time to Just Add Resources

Not every high-memory situation is a misconfiguration. If you've genuinely outgrown your hosting tier — real concurrent traffic, a large catalog, multiple integrations all running simultaneously — then more memory is the correct answer, not a workaround. The nopCommerce team's own general guidance for a single demo-level store is roughly 180–300 MB baseline; if your real production traffic justifies more than that, scaling resources is the right call. The goal of this guide is to make sure you're not paying for extra RAM to compensate for a setting that takes five minutes to fix.

Frequently Asked Questions

Why does NopCommerce use so much memory right after a restart?
This is typically normal "cold start" behavior — .NET is loading and JIT-compiling assemblies for every installed plugin and theme component for the first time. If memory settles back to a stable baseline within several minutes under normal traffic, it's not a problem worth chasing.
Is Server Garbage Collection bad for NopCommerce?
Not inherently — it's designed for high-throughput, multi-core server workloads. The issue is that it's the .NET default on server operating systems, and it reserves memory per CPU core regardless of your actual traffic. For most small-to-mid traffic stores, Workstation GC uses significantly less memory with no noticeable performance difference.
How much memory should a NopCommerce store normally use?
A clean install with light traffic typically runs 180–300 MB. Anything consistently above 500 MB–1 GB for a low-to-moderate traffic store is worth investigating using the steps in this guide, starting with GC mode and app pool bitness.
Can a single plugin really cause this much memory usage?
Yes. We've seen individual plugins — particularly ones with heavy client-side widgets, sliders, or background feed processing — account for hundreds of megabytes on their own. The official nopCommerce forums have documented similar cases tracing back to a single specific plugin.
Do I need to upgrade my hosting plan to fix high memory usage?
Not usually as the first step. Most cases we encounter resolve through GC mode and application pool configuration changes, which cost nothing. Hosting upgrades make sense once you've confirmed your traffic and catalog size genuinely require more resources.
How do I find which plugin is causing a memory leak?
Disable plugins one at a time, fully removing the folder rather than just disabling through the admin panel, restarting and re-measuring memory after each change. For confirmed leaks that don't trace back to a specific plugin, a memory profiling tool like dotMemory can capture a snapshot showing exactly which object types are accumulating.

Final Thoughts

High memory usage in nopCommerce is almost always fixable without upgrading your hosting plan. Start with the diagnostic steps, identify which pattern you're seeing, and work through the causes in order. In our experience, 70% of cases resolve with just GC mode and app pool bitness changes — settings that cost nothing and take minutes to implement.

If you'd like professional help diagnosing and fixing your store's performance issues, or if you're building a new store and want to avoid these pitfalls from the start, our team at BSS is here to help. Browse our nopCommerce plugins and themes — every product we build is tested for memory footprint before it ships, not just functionality.