顶部:DATA = RES + 堆栈 + 什么?

顶部:DATA = RES + 堆栈 + 什么?

我分析了 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到底算什么?虚拟(保留但未分配)堆栈?内存映射文件?正如我之前写的:RESRAM_USED_DELTA所以可用内存量没有减少 150MB,因此它可能指示虚拟内存,但内存指示器是驻留集和虚拟量的总和会很奇怪......

内存使用情况图表

(在此图表中,所描述的线条*_DELTA是相对于程序的开头,即靠近左侧,即红色P_RSS开始的位置)

答案1

DATA字段是进程的虚拟内存,分配给非可执行代码的东西,即数据;它包括静态数据、堆栈和动态分配的内存;它与字段 CODE 一起包含在总虚拟内存中。 RESident 大小是 RAM 中实际的虚拟内存量;它由部分代码、部分数据和其他部分(例如内存映射文件)组成。

您会注意到 VIRT、CODE、DATA 和 RES 之间没有直接关系。 CODE来自编译器; VIRT 和 DATA 受进程控制(malloc()free()mmap()等); RES部分由操作系统控制。

相关内容