我分析了 Linux Mint 上 java 程序的内存消耗。我曾经top
捕获内存统计信息(程序使用的内存以及系统范围的指标,如total_mem_used和mem_free)。结果令人惊讶:
- “已用物理内存”(
RAM_USE_DELTA
在图表上)增加,“可用物理内存”(在图表上恢复RAM_FREE_DELTA
)减少与 RES(P_RSS
在图表上)增加相同的量 - 这就是我的预期 - DATA(
P_DATA
图表上)字段(在top
的 man 中描述为“专用于可执行代码以外的物理内存量”)比 RES 高 150 兆。 - 隔夜利息(
SWAP_USE_DELTA
图表上)始终为零 - SHR(共享内存;
P_SHR
图表上)小于 15MB
问题是:前面提到的150MB到底算什么?虚拟(保留但未分配)堆栈?内存映射文件?正如我之前写的:RES
〜RAM_USED_DELTA
所以可用内存量没有减少 150MB,因此它可能指示虚拟内存,但内存指示器是驻留集和虚拟量的总和会很奇怪......
(在此图表中,所描述的线条*_DELTA
是相对于程序的开头,即靠近左侧,即红色P_RSS
开始的位置)
答案1
DATA字段是进程的虚拟内存,分配给非可执行代码的东西,即数据;它包括静态数据、堆栈和动态分配的内存;它与字段 CODE 一起包含在总虚拟内存中。 RESident 大小是 RAM 中实际的虚拟内存量;它由部分代码、部分数据和其他部分(例如内存映射文件)组成。
您会注意到 VIRT、CODE、DATA 和 RES 之间没有直接关系。 CODE来自编译器; VIRT 和 DATA 受进程控制(malloc()
、free()
、mmap()
等); RES部分由操作系统控制。