The r/Juniper thread "High Memory Util on our Core Switch — EX4600 JUNOS" ends with a JTAC statement that reorients the whole conversation: it is normal for this firmware to run about 75% utilized memory. Before and after an upgrade, utilization can jump tens of percent with no leak at all. Here is how to read EX-series memory the way TAC does.

Why 75% Can Be Normal: Pre-Allocation

Junos allocates memory for structures the switch may need — buffer descriptors, hash tables, route and MAC table headroom — at boot, not on demand. The number everyone stares at (Mem: xx% used) is mostly that static reservation. On EX4600/EX4300 class hardware, a steady 70–80% with stable processes is the design center, not a warning. The mistake is judging memory by total percentage alone.

Read It Properly: Split Kernel from Processes

show system buffers
show system processes extensive
show chassis routing-engine

Two questions matter: how much is kernel-allocated (buffers, descriptors — the static part) and how much is process heap (RSS of daemons — the part that can leak). Judge each separately: kernel growth after config changes can be normal scale-out; process RSS growth over days without traffic growth is the leak signature.

The Leak Signature

show system processes extensive | match "rpd|snmpd|mgd|eventd|mib2d"

Watch a specific daemon's RES (resident) memory over hours: leak means monotonic growth uncorrelated with load — rpd climbing during a quiet Sunday night, snmpd growing without polling changes. Contrast with load-correlated growth (mib2d rising during a big SNMP walk, rpd rising during route churn), which is healthy scaling. Record values hourly; a graph of RSS over 24 hours separates the two cases instantly.

What Actually Fixes It

  • Known leaks: each Junos release fixes some and introduces others; if a daemon grows without bound on your version, check release notes and known-issues for that daemon, and plan an upgrade to the recommended release — following the validation and rollback procedure in our Junos upgrade guide so the memory fix does not arrive with a validation failure.
  • Self-inflicted load: oversized SNMP walks, aggressive NETCONF pollers and leftover traceoptions all inflate daemon memory. The SNMP polling guide trims the biggest offender.
  • Structural pressure: MAC tables filling from a spoofing host or loop (the EX MAC flooding guide shows the protection commands) forces scale-out that can push marginal platforms over their comfortable range.
  • Restart discipline: restart <daemon> gracefully frees leaked memory immediately and is safe for most daemons — but schedule it; the same reasoning as the mgd restart warning applies.

Decision Table

ObservationVerdictAction
75-80% steady, processes stableNormal pre-allocationNone — monitor trend
Jump after Junos upgradeNew version allocationsConfirm with JTAC/release notes
One daemon RSS climbing dailyLeakIdentify version, upgrade/restart daemon
Memory + CPU climbing together during pollsPoller pressureTune NMS, add SNMP views

Memory that "feels high" is the least actionable alarm in networking; the trend of individual daemon RSS is the actionable one. Pair this method with the CPU side of the same equation in the routing engine high-CPU guide, and remember both matter most when the box is also carrying overlay duties — the resource behavior of EVPN leaf deployments is covered in the EX3400/EX4300 leaf guide.