一,不是 malloc 后就马上占用实际内存,而是第一次使用时(如对内存赋值,memset等操作)发现虚存对应的物理页面未分配,产生缺页中断,才真正分配物理页面,
同时更新进程页面的映射关系。但由于每个物理内存页面大小是 4k ,不管 memset其中的1k还是5k 、7k ,实际占用物理内存总是 4k 的倍数。所以 RSS 的增量总是 4k 的倍数。
二,可以通过如下命令查看一个进程占有的虚拟内存和物理内存大小:
ps aux | grep pid | grep -v grep
其中关键的两信息(第五、六列)为:
1. VSZ , virtual memory size ,表示进程总共使用的虚拟地址空间大小,包括进程地址空间的代码段、数据段、堆、文件映射区域、栈、内核空间等所有虚拟地址使用的总和,单位是 K
2. RSS , resident set size ,表示进程实际使用的物理内存空间, RSS 总小于 VSZ 。
三,关于内存释放
malloc 使用 mmap 分配的内存 ( 大于 128k) , free 会调用 munmap 系统调用马上还给 OS ,实现真正释放。
堆内的内存,只有释放堆顶的空间,同时堆顶总连续空闲空间大于 128k 才使用 sbrk(-SIZE) 回收内存,真正归还 OS 。
堆内的空闲空间,是不会归还给 OS 的。
随着系统频繁地 malloc 和 free ,尤其对于小块内存,堆内将产生越来越多不可用的碎片,导致“内存泄露”。而这种“泄露”现象使用 v
同时更新进程页面的映射关系。但由于每个物理内存页面大小是 4k ,不管 memset其中的1k还是5k 、7k ,实际占用物理内存总是 4k 的倍数。所以 RSS 的增量总是 4k 的倍数。
二,可以通过如下命令查看一个进程占有的虚拟内存和物理内存大小:
ps aux | grep pid | grep -v grep
其中关键的两信息(第五、六列)为:
1. VSZ , virtual memory size ,表示进程总共使用的虚拟地址空间大小,包括进程地址空间的代码段、数据段、堆、文件映射区域、栈、内核空间等所有虚拟地址使用的总和,单位是 K
2. RSS , resident set size ,表示进程实际使用的物理内存空间, RSS 总小于 VSZ 。
三,关于内存释放
malloc 使用 mmap 分配的内存 ( 大于 128k) , free 会调用 munmap 系统调用马上还给 OS ,实现真正释放。
堆内的内存,只有释放堆顶的空间,同时堆顶总连续空闲空间大于 128k 才使用 sbrk(-SIZE) 回收内存,真正归还 OS 。
堆内的空闲空间,是不会归还给 OS 的。
随着系统频繁地 malloc 和 free ,尤其对于小块内存,堆内将产生越来越多不可用的碎片,导致“内存泄露”。而这种“泄露”现象使用 v