目录
命令及其结果
参数解读
有趣的实验
在 macOS 系统中,虚拟内存统计指标提供了对系统内存使用情况和虚拟内存操作的重要洞察。通过分析这些指标,我们可以更好地了解系统的性能状况和内存管理情况。
命令及其结果
>>> vm_stat
Mach Virtual Memory Statistics: (page size of 4096 bytes)
Pages free: 7665.
Pages active: 7161271.
Pages inactive: 7157755.
Pages speculative: 1684.
Pages throttled: 0.
Pages wired down: 1454118.
Pages purgeable: 26180.
"Translation faults": 6791372835.
Pages copy-on-write: 57696402.
Pages zero filled: 1703440882.
Pages reactivated: 152904898.
Pages purged: 2745445.
File-backed pages: 2962038.
Anonymous pages: 11358672.
Pages stored in compressor: 12269616.
Pages occupied by compressor: 993465.
Decompressions: 188199124.
Compressions: 377521942.
Pageins: 63862215.
Pageouts: 361515.
Swapins: 24523111.
Swapouts: 29537178.
参数解读
- Pages free: 这个指标表示系统中当前可用的空闲页面数量。在需要分配新内存时,这些空闲页面将被使用。
- Pages active: 表示当前正在使用或最近被使用的页面数量。这些页面包含了当前正在执行的程序或者最近被访问的数据。
- Pages inactive: 表示最近被使用过但现在处于不活跃状态的页面数量。这些页面保留在内存中,以便在需要时快速访问。
- Pages speculative: 这些页面被系统预测会被使用,但实际上并未被使用。
- Pages throttled: 表示因系统资源限制而被限制访问的页面数量。
- Pages wired down: 无法交换出到磁盘的页面数量,通常包含了内核和系统重要数据。
- Pages purgeable: 可以被移除或清除的页面数量,以释放内存空间。
- Translation faults: 表示在虚拟内存中发生的页转换错误次数,包括缺页中断。
- Pages copy-on-write: 表示发生写时复制的页面数量,用于在进程间共享数据时避免写操作相互影响。
- Pages zero filled: 表示被填充为零的页面数量,通常用于初始化时分配给进程。
- Pages reactivated: 表示被重新激活的页面数量,曾经处于非活跃状态但现在又被重新使用。
- Pages purged: 表示被清除或移除的页面数量,通常用于释放内存空间。
- File-backed pages: 表示文件支持的页面数量,包含与文件关联的数据。
- Anonymous pages: 表示不与文件关联的页面数量,通常包含动态分配的堆内存等。
- Pages stored in compressor: 表示存储在压缩器中的页面数量,用于节省内存空间。
- Pages occupied by compressor: 表示压缩器占用的页面数量,用于存储压缩后的页面数据。
- Decompressions: 表示解压缩的次数,从压缩状态恢复到原始页面状态。
- Compressions: 表示压缩的次数,将页面压缩以节省内存空间。
- Pageins: 表示页面调入次数,从磁盘调入页面到内存中。
- Pageouts: 表示页面调出次数,将页面从内存调出到磁盘中。
- Swapins: 表示交换进程的次数,从交换文件中调入进程到内存中。
- Swapouts: 表示交换出进程的次数,将进程调出到交换文件中释放内存空间。
有趣的实验
如下代码,可在macos上运行,但在linux上会OOM(如果内存不足的情况)
a=[1]*1024*1024*1024
b=[2]*1024*1024*1024
# 上述代码会占用内存,每个约9GB的样子
c = []
c.extend(a)
c.extend(b)
上述代码中,执行extend方法过内存会继续增长,此时如果linux的内存(包括虚拟内存)不足,会直接oom。
MacOS中则不同,MacOS中可以申请到很大的虚拟内存,代码可以正常执行。
通过htop
命令可以发现,MacOS下的虚拟实际虚拟内存大小。
这里可以看到MacOS交换内存大小为23G,实际测试下来,程序的虚拟内存占用甚至可以到500GB以上,这个远远超出了实际内存+虚拟内存的大小。