惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Register - Security
The Register - Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MyScale Blog
MyScale Blog
V
Visual Studio Blog
云风的 BLOG
云风的 BLOG
aimingoo的专栏
aimingoo的专栏
C
Check Point Blog
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
L
LangChain Blog
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Security @ Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
人人都是产品经理
人人都是产品经理
H
Hacker News: Front Page
L
Lohrmann on Cybersecurity
T
Troy Hunt's Blog
T
Threat Research - Cisco Blogs
A
About on SuperTechFans
T
Threatpost
AWS News Blog
AWS News Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Tor Project blog
Google Online Security Blog
Google Online Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tenable Blog
W
WeLiveSecurity
博客园 - 叶小钗
K
Kaspersky official blog
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
M
MIT News - Artificial intelligence
Hacker News - Newest:
Hacker News - Newest: "LLM"
Engineering at Meta
Engineering at Meta
有赞技术团队
有赞技术团队
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Secure Thoughts
小众软件
小众软件
D
Docker
爱范儿
爱范儿
C
Cyber Attacks, Cyber Crime and Cyber Security
N
News and Events Feed by Topic
S
Schneier on Security
博客园 - 三生石上(FineUI控件)
D
DataBreaches.Net

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
WordPress Memory Limit: How to Find What’s Eating Your PHP Memory
MakeWPFast · 2026-06-23 · via DEV Community

Originally published on https://makewpfast.com/wordpress-memory-limit-find-whats-eating-php-memory/

Every “fix memory exhausted” article tells you the same thing – bump WP_MEMORY_LIMIT to 256M and move on. That’s not a fix. That’s duct tape. The real question nobody answers is: what’s eating your memory in the first place?

I’ve profiled hundreds of WordPress sites. The pattern is always the same – someone raises the limit, things work for a while, then the error comes back. Because the actual problem is still there, just hiding behind a bigger number.

Let’s And when memory exhaustion tips a site from slow into a full white-screen crash — wp-admin included, so you can’t even log in to raise the limit — that’s no longer a tuning job. At that point the fastest route back online is to get a crashed WordPress site fixed, then come back and deal with the root cause once you’re live again.

actually diagnose it.

Understanding WordPress Memory – The Two Limits You Need to Know

WordPress has two separate memory ceilings, and most people confuse them.

PHP’s memory_limit is the hard cap set in your server’s php.ini (or pool config). This is the absolute maximum any PHP process can use.

WordPress’s WP_MEMORY_LIMIT is a soft limit WordPress sets for itself. It’s defined in wp-config.php and can never exceed the PHP limit.

There’s also WP_MAX_MEMORY_LIMIT – which applies only to admin-side operations (wp-admin). WordPress sets this to 256M by default.

Here’s the thing most guides skip: if your PHP memory_limit is 128M and you set WP_MEMORY_LIMIT to 512M, you still only get 128M. WordPress can’t override the server. It can only request up to what PHP allows.

To check your actual limits, drop this in a mu-plugin:

<?php
// File: wp-content/mu-plugins/memory-check.php
add_action('admin_notices', function() {
    if (!current_user_can('manage_options')) return;

    $php_limit    = ini_get('memory_limit');
    $wp_limit     = defined('WP_MEMORY_LIMIT') ? WP_MEMORY_LIMIT : '40M';
    $wp_max_limit = defined('WP_MAX_MEMORY_LIMIT') ? WP_MAX_MEMORY_LIMIT : '256M';
    $current_use  = round(memory_get_usage() / 1024 / 1024, 2);
    $peak_use     = round(memory_get_peak_usage() / 1024 / 1024, 2);

    echo '<div class="notice notice-info">';
    echo "<p><strong>Memory:</strong> PHP limit: {$php_limit} | ";
    echo "WP limit: {$wp_limit} | WP admin limit: {$wp_max_limit} | ";
    echo "Current: {$current_use}MB | Peak: {$peak_use}MB</p>";
    echo '</div>';
});

That gives you the full picture in one glance. If your peak usage is consistently close to the limit – say above 80% – you have a problem that needs investigating, not just a bigger number.

Where Memory Actually Goes in WordPress

PHP memory in WordPress gets consumed by four main things:

1. Plugin code loaded into memory. Every active plugin loads its PHP files on every single request. A plugin with 50 PHP files and a bunch of class autoloading? All of that sits in memory.

2. Database query results. When a plugin runs get_posts() without a limit, or loads the entire options table, all that data lives in PHP memory until the request ends. I wrote about this in the context of autoloaded options – a bloated autoload table eats memory on every single page load.

3. Image processing. When WordPress generates thumbnails or processes an uploaded image, it loads the full image into memory. A 5MB JPEG can easily consume 30-40MB of PHP memory when being manipulated by GD or Imagick.

4. Object caching and globals. WordPress stores a lot of intermediate data in memory – post objects, user objects, cached queries. If you’re running WooCommerce with thousands of products and a poorly written product query, that’s all sitting in RAM.

Step 1: Measure Current Memory Usage Per Page

Before you start disabling things randomly, measure. Add this to your theme’s functions.php or better yet, as a mu-plugin:

<?php
// File: wp-content/mu-plugins/memory-profiler.php
add_action('shutdown', function() {
    if (!current_user_can('manage_options')) return;
    if (defined('DOING_AJAX') && DOING_AJAX) return;
    if (defined('REST_REQUEST') && REST_REQUEST) return;

    $peak = memory_get_peak_usage(true);
    $peak_mb = round($peak / 1024 / 1024, 2);

    // Log to debug.log
    error_log(sprintf(
        '[Memory] %s - Peak: %sMB - URI: %s',
        date('H:i:s'),
        $peak_mb,
        $_SERVER['REQUEST_URI'] ?? 'unknown'
    ));
});

Make sure WP_DEBUG and WP_DEBUG_LOG are enabled in wp-config.php. Then browse your site – hit the homepage, a few posts, the admin dashboard, the plugins page. Check wp-content/debug.log afterwards.

What you’re looking for: which pages use the most memory? If your homepage uses 45MB but the admin plugins page uses 120MB, that tells you something. If a specific post type archive spikes to 90MB, that’s worth investigating.

For a deeper look at your wp-config.php debug constants and what each one does, check the wp-config.php performance tuning guide.

Step 2: Find the Memory-Hungry Plugins

This is where it gets interesting. Most guides tell you to deactivate all plugins and reactivate one by one. That works, but it’s painfully slow and doesn’t give you numbers.

Here’s a mu-plugin that measures memory before and after each plugin loads:

<?php
// File: wp-content/mu-plugins/plugin-memory-audit.php
// WARNING: Dev/staging only. Remove after diagnosis.

add_action('pre_current_active_plugins', function() {
    if (!current_user_can('manage_options')) return;

    $active_plugins = get_option('active_plugins', []);
    $measurements = [];

    foreach ($active_plugins as $plugin) {
        $file = WP_PLUGIN_DIR . '/' . $plugin;
        if (!file_exists($file)) continue;

        $before = memory_get_usage();
        // Note: plugins are already loaded at this point
        // This reads the file size as a proxy for code weight
        $size = filesize($file);
        $measurements[$plugin] = [
            'main_file_kb' => round($size / 1024, 1),
        ];
    }

    // Sort by file size descending
    uasort($measurements, fn($a, $b) => $b['main_file_kb'] <=> $a['main_file_kb']);

    echo '<div class="notice notice-info"><pre>';
    echo "Plugin Main File Sizes (larger = potentially more memory):nn";
    foreach ($measurements as $plugin => $data) {
        printf("%-50s %6.1f KBn", basename(dirname($plugin)), $data['main_file_kb']);
    }
    echo '</pre></div>';
});

But the real way to measure per-plugin memory impact is with the binary deactivation method. It’s faster than one-by-one:

  1. Note your baseline peak memory (from Step 1)
  2. Deactivate half your plugins
  3. Measure again. Did memory drop significantly?
  4. If yes, the culprit is in the deactivated half. Reactivate them, deactivate the other half.
  5. Keep halving until you find the offender

With 20 plugins, this takes 4-5 rounds instead of 20 individual tests.

If you want to skip the manual work, Query Monitor shows memory usage per component. Install it, load a page, and check the “Environment” panel for current and peak memory. The “Queries by Component” panel shows you which plugins are running the most database queries – which correlates heavily with memory use.

Step 3: Investigate the Usual Suspects

In my experience diagnosing WordPress performance issues, these are the categories that eat the most memory:

Page builders (40-80MB). Elementor, Divi, WPBakery – they load massive amounts of PHP code and rendering logic on every request, even on pages that don’t use the builder. If you’re using Elementor on 3 pages but it’s loading its full stack on all 200 pages, that’s a problem.

WooCommerce (30-60MB). This is basically an application within an application. It’s legitimate memory usage, but it adds up fast when combined with WooCommerce extensions. If you have WooCommerce + 15 WooCommerce add-ons, don’t be surprised when you need 256MB+.

Multilingual plugins (20-40MB). WPML in particular loads a lot of translation data into memory. If you’re running a multilingual WooCommerce store, you’re stacking two heavy plugins together.

SEO plugins with real-time analysis (15-30MB). Yoast and Rank Math load content analysis libraries in the editor. This is mostly an admin-side concern.

Backup plugins during execution. When a backup runs, it can temporarily spike memory way beyond normal levels. If your memory errors happen at scheduled times, check your backup schedule.

For help diagnosing specific plugin conflicts, I wrote a separate guide on that.

Step 4: Check Your Database for Memory Bloat

A source of memory usage people rarely check: the database queries themselves.

Enable SAVEQUERIES temporarily in wp-config.php:

define('SAVEQUERIES', true);

Then add this to see what’s happening:

<?php
// Add to your memory-profiler mu-plugin
add_action('shutdown', function() {
    if (!current_user_can('manage_options')) return;
    if (!defined('SAVEQUERIES') || !SAVEQUERIES) return;

    global $wpdb;
    $total_queries = count($wpdb->queries);
    $slow_queries = 0;
    $total_time = 0;

    foreach ($wpdb->queries as $q) {
        $total_time += $q[1];
        if ($q[1] > 0.05) $slow_queries++;
    }

    error_log(sprintf(
        '[Queries] %s - Total: %d - Slow (>50ms): %d - Time: %.3fs - URI: %s',
        date('H:i:s'),
        $total_queries,
        $slow_queries,
        $total_time,
        $_SERVER['REQUEST_URI'] ?? 'unknown'
    ));
});

Important: SAVEQUERIES itself uses extra memory because it stores every query in an array. Only enable it during diagnosis, then turn it off. I’ve seen sites where enabling SAVEQUERIES was enough to push them over the memory limit – which tells you something about how many queries they’re running.

If you’re seeing hundreds of queries per page load, that’s a memory problem disguised as a query problem. Every result set sits in PHP memory. A query returning 10,000 rows of post meta data? That’s all in RAM.

For a deeper dive into slow queries, check the slow queries diagnostic guide.

Step 5: The Autoload Trap

This one deserves its own callout because it’s so common. Every page load in WordPress runs one query to load all autoloaded options from wp_options. All of them. Into memory.

Check how much data that is:

SELECT SUM(LENGTH(option_value)) as autoload_size
FROM wp_options
WHERE autoload = 'yes';

If that number is over 1MB, you have a problem. I’ve seen sites with 5-10MB of autoloaded data – that’s 5-10MB of memory consumed before WordPress even starts rendering a page.

Common culprits: abandoned plugin settings that left autoload = 'yes' entries behind, transients stored with autoload on, and serialized blobs from plugins that cache data in options instead of using the object cache.

I wrote an entire post about the autoload problem and how to fix it. If your autoload size is over 1MB, start there.

Step 6: Image Processing Spikes

If your memory errors happen specifically during uploads, the problem is almost certainly image processing.

When you upload a 4000x3000px image, WordPress generates multiple thumbnail sizes. The GD library (default) needs to hold the entire uncompressed image in memory. The formula is roughly:

width x height x channels x bytes_per_channel

For a 4000×3000 RGBA image: 4000 * 3000 * 4 * 1 = ~46MB. Just for one image in memory. Now multiply that by each thumbnail being generated.

Solutions:

  • Switch to Imagick if available – it streams from disk instead of loading everything into memory
  • Limit maximum upload dimensions with big_image_size_threshold filter (WordPress 5.3+)
  • Reduce registered image sizes – every size means another memory allocation during upload
// Limit uploaded images to 2560px max (WordPress default since 5.3)
// Lower it if you're hitting memory limits during uploads
add_filter('big_image_size_threshold', function() {
    return 1920; // Max dimension in pixels
});

When to Actually Increase the Limit

Sometimes you genuinely need more memory. Here’s when increasing makes sense:

  • You’re running WooCommerce with extensions – 256M is reasonable
  • You have a legitimate need for heavy plugins (LMS, membership, multilingual + ecommerce)
  • You’ve already optimized and your peak usage is still near the limit

And here’s how to set it properly:

// In wp-config.php - ABOVE the "That's all, stop editing!" line
define('WP_MEMORY_LIMIT', '256M');       // Frontend
define('WP_MAX_MEMORY_LIMIT', '512M');   // Admin/backend

But also check your PHP config. You can’t just set the WordPress constant – the PHP limit needs to match or exceed it. Ask your host, or check via phpinfo() or Site Health > Info > Server.

If your admin dashboard is slow, high memory usage is often part of the puzzle. Memory pressure causes PHP to spend more time on memory management, which slows everything down.

A Practical Diagnostic Workflow

Here’s the process I follow when someone reports memory errors:

  1. Check the limits. What’s PHP’s memory_limit? What’s WP_MEMORY_LIMIT? Are they aligned?
  2. Measure baseline. Drop in the memory profiler mu-plugin. Browse the site. Note peak usage on key pages.
  3. Check autoload size. Run the SQL query. If it’s over 1MB, clean it up first – that’s often the quickest win.
  4. Binary plugin test. Deactivate half, measure, narrow down. Find the top 2-3 memory consumers.
  5. Decide. Can you replace the heavy plugin? Optimize its settings? Or do you genuinely need to increase the limit?
  6. Monitor. Leave the memory logging mu-plugin active for a week. Watch for spikes that correlate with cron jobs, backups, or specific user actions.

The whole process takes about an hour for most sites. And it gives you actual data instead of blindly throwing memory at the problem.

Tools That Help

A few tools I use regularly for memory diagnosis:

  • Query Monitor – Shows memory usage, query count per component, and hooks. Essential for any WordPress developer.
  • WP Multitool – The System Info module shows your memory limits at a glance, Config Manager lets you toggle debug constants without editing files, and the Autoloader Optimizer helps clean up bloated autoload data. Full disclosure – I built this one.
  • Code Profiler – If you need deep PHP-level profiling, this generates detailed charts showing which scripts, classes, and functions use the most resources.
  • PHP’s built-in functionsmemory_get_usage() and memory_get_peak_usage() are your friends. They’re simple, accurate, and don’t require any plugin.

The Takeaway

The memory exhausted error is a symptom, not a diagnosis. Increasing the limit without understanding what’s consuming the memory is like turning up the music to ignore a rattling engine.

Measure first. Find the actual consumer. Then decide whether to optimize it, replace it, or genuinely allocate more memory. In most cases I’ve seen, a combination of cleaning up autoloaded data and replacing one heavy plugin solves the problem without touching the memory limit at all.

If you’re seeing memory issues alongside database bloat or general slowness, those problems feed into each other. Fix them together.