静态编译二进制为何存在非零PSS?且RSS更低、PSS更高?
关于静态/动态编译程序PSS与RSS的疑问解答
疑问一:静态编译的二进制文件为何存在非零PSS值?
你对PSS的核心定义理解正确,但忽略了内核层面的共享页面。哪怕是静态编译的程序,也会映射内核提供的通用共享内存区域,比如VDSO(虚拟动态共享对象)——这是内核为所有用户进程提供的快速系统调用入口,属于全局共享的页面。
当只有你的静态程序在运行时,这些共享页面的PSS计算就是其完整大小(没有其他进程分摊),再加上程序自身的非共享页面,最终PSS自然不为零。从你的数据来看,静态程序RSS(808KB)和PSS(804KB)的4KB差值,大概率就是这类内核共享页面的贡献。
疑问二:为何静态编译程序的RSS更低但PSS更高?
这是两种编译方式的内存共享特性直接导致的:
- 静态编译:程序把所有依赖的库代码、数据都打包进自身二进制,运行时这些页面几乎都是进程独有的非共享页面。RSS是进程实际占用的物理内存(包含共享页面的完整大小),而PSS是“非共享页面+共享页面均分”——因为几乎没有需要分摊的共享页面,所以PSS数值接近RSS。同时静态编译无需加载外部动态库,整体内存开销更小,因此RSS比动态编译的程序低。
- 动态编译:程序运行时依赖系统中的动态库(比如libc、ld-linux),这些库的页面被系统中大量进程共享。RSS会把整个动态库的大小算进去(进程确实映射了这些页面),但PSS只计算这些共享页面的均分份额(比如400KB的libc页面被100个进程共享,你的程序仅分摊4KB)。再加上程序自身的少量非共享页面,最终PSS数值远低于RSS,也比静态编译的PSS小很多。
内容的提问来源于stack exchange,提问作者md.jamal
相关产品推荐
相关产品推荐

