关于Erlang中erlang:memory()与memsup:get_system_memory_data()的释义疑问
拆解Erlang两个内存统计函数的区别
我来用大白话给你讲清楚这两个函数里的内存指标差异:
1. erlang:memory() 中的 total 项
当前已分配的内存总量,等于进程内存与系统内存之和
这个指标可以理解为Erlang虚拟机已经实际“用起来”的内存总和:
- 它包含两部分:所有Erlang进程各自占用的内存(比如进程的栈、堆、消息队列这些),加上虚拟机自身运行需要的系统级内存(比如虚拟机内部的缓存、管理数据结构、底层服务占用的内存)
- 简单说,这就是虚拟机当前“实打实占住”的内存,相当于你打开软件后,任务管理器里看到的该软件已使用内存。
2. memsup:get_system_memory_data() 中的 total_memory 项
Erlang模拟器可用的内存总量,包括已分配和空闲部分,可能与系统配置内存不等
这个指标是Erlang虚拟机能调用的整个内存“池子”大小:
- 它不仅包含虚拟机已经用了的内存,还包括还没用到但虚拟机有权使用的空闲内存
- 这个值不一定等于物理内存总大小:比如你给Erlang虚拟机设置了内存上限(通过启动参数
+P、+M之类的配置),那它就是你设置的上限;如果没设置,那它是主机系统当前能分配给虚拟机的内存总量(要扣掉系统其他程序已经占用的部分)。
一句话对比
erlang:memory()的total:已经花出去的钱memsup:get_system_memory_data()的total_memory:钱包里总共能花的钱(含已花的)
内容的提问来源于stack exchange,提问作者zoro




