How can I measure the actual memory usage of an application or process?
Categories:
How to Accurately Measure Application Memory Usage on Linux

Learn various methods to precisely measure the actual memory consumption of applications and processes on Linux systems, from basic commands to detailed analysis.
Understanding how much memory your applications and processes consume is crucial for performance tuning, resource allocation, and troubleshooting memory leaks. On Linux, memory usage can be complex, involving concepts like Resident Set Size (RSS), Virtual Memory Size (VSZ), Shared Memory, and Private Memory. This article will guide you through different tools and techniques to get an accurate picture of memory usage, focusing on practical commands and their interpretations.
Understanding Linux Memory Metrics
Before diving into tools, it's important to grasp the key memory metrics reported by Linux. Each metric provides a different perspective on how a process utilizes memory:
- VSZ (Virtual Memory Size): The total amount of virtual memory the process has access to. This includes all code, data, and shared libraries, even if they are not currently loaded into RAM or are shared with other processes. It's often much larger than actual physical memory usage.
- RSS (Resident Set Size): The portion of the process's memory that is currently held in physical RAM. This includes both private and shared memory pages. RSS is a more accurate indicator of physical memory consumption than VSZ, but it can still be misleading due to shared libraries.
- Shared Memory: Memory pages that can be shared between multiple processes. When multiple processes use the same library (e.g.,
libc.so
), only one copy of the library's code needs to be in RAM, and all processes share those pages. RSS includes the entire size of shared memory, even if only a fraction is attributable to a single process. - Private Memory: Memory pages that are exclusively used by a single process and cannot be shared with others. This is often the most critical metric for identifying a process's unique memory footprint, as it represents memory that only that process is using.
flowchart TD A[Process Memory] --> B{VSZ} A --> C{RSS} C --> D[Shared Memory] C --> E[Private Memory] B --> F[Total Virtual Address Space] D --> G[Shared Libraries/Data] E --> H[Unique Process Data/Heap/Stack] F --"Includes"--> G F --"Includes"--> H G --"Can be shared by multiple processes"--> D H --"Exclusive to one process"--> E
Relationship between key Linux memory metrics
Basic Memory Usage with ps
and top
The ps
and top
commands are fundamental tools for quick memory checks. While they provide a good overview, their RSS reporting can be misleading for shared memory.
ps aux | grep <process_name_or_pid>
# Example for a web server process
ps aux | grep nginx
# Output columns:
# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
Using ps aux
to view process details, including VSZ and RSS.
top
# Press 'M' to sort by memory usage (RSS)
# Press 'q' to quit
Using top
for real-time process monitoring, sorted by RSS.
%MEM
column in ps
and top
is calculated based on RSS. If a system has 16GB RAM and a process has 1GB RSS, it will show ~6.25% MEM. Remember that RSS includes shared memory, so this percentage might overstate a process's unique footprint.Measuring Private Memory Usage with smaps
and pmap
To get a more accurate picture of a process's actual memory footprint, you need to differentiate between shared and private memory. The /proc/<pid>/smaps
file and the pmap
command are excellent for this.
The /proc/<pid>/smaps
file provides detailed memory mapping information for a process, including Pss
(Proportional Set Size), Rss
(Resident Set Size), Shared_Clean
, Shared_Dirty
, Private_Clean
, and Private_Dirty
for each memory region. Pss
is particularly useful as it accounts for shared memory by dividing it proportionally among processes that share it. The sum of Private_Clean
and Private_Dirty
gives you the total private memory.
# Find the PID of your process (e.g., 'nginx')
PID=$(pgrep nginx)
# View detailed memory maps
cat /proc/$PID/smaps | less
# Calculate total Pss (Proportional Set Size)
grep Pss /proc/$PID/smaps | awk '{sum+=$2} END {print sum " KB"}'
# Calculate total Private Memory
grep Private /proc/$PID/smaps | awk '{sum+=$2} END {print sum " KB"}'
Extracting Pss and Private Memory from /proc/<pid>/smaps
.
The pmap
command is a user-friendly wrapper around /proc/<pid>/smaps
that summarizes the memory usage. It can directly report RSS
, Dirty
, and Private
memory.
# Find the PID of your process
PID=$(pgrep nginx)
# Show detailed memory map
pmap -x $PID
# Output will include columns like:
# Address Kbytes RSS Dirty Mode Mapping
# ...
# total 123456 54321 12345
Using pmap -x
for a detailed memory map summary.
Private_Clean
and Private_Dirty
from /proc/<pid>/smaps
, or the 'Private' column from pmap -x
. Pss
is also a very good metric as it proportionally allocates shared memory.Using htop
for Interactive Monitoring
htop
is an interactive process viewer that offers a more user-friendly interface than top
and can be configured to show more detailed memory metrics.
sudo apt install htop # Debian/Ubuntu
sudo yum install htop # CentOS/RHEL
htop
# In htop, press 'F2' (Setup) -> 'Columns' -> add 'PSS' or 'M_PRIVATE' to the active columns.
Installing and configuring htop
to display PSS or Private Memory.
Advanced Analysis with meminfo
and slabtop
For system-wide memory analysis or understanding kernel memory usage, /proc/meminfo
and slabtop
are invaluable.
cat /proc/meminfo
# Key metrics:
# MemTotal: Total physical RAM
# MemFree: Unused RAM
# MemAvailable: Estimated memory available for new applications (accounts for buffers/cache)
# Buffers: Memory used by kernel buffers
# Cached: Memory used by page cache (disk cache)
# SwapTotal/SwapFree: Swap space usage
Viewing system-wide memory statistics from /proc/meminfo
.
slabtop
# Press 'c' to sort by cache size
# Press 'q' to quit
Using slabtop
to monitor kernel slab cache usage.
MemFree
with truly available memory. Linux uses free RAM for disk caching (Cached) and buffers to improve performance. MemAvailable
is a more realistic indicator of how much memory is truly available for new applications without swapping.