在Linux中,我使用/usr/bin/time -f %M
工具(gnu-time)来获取用于单个进程/程序的内存峰值。但每次运行此命令时,我都会得到不同的结果。
附:我已经使用过其他方法,比如从内存中获取快照的方法(比如从/proc/pid
读取),但由于我的程序结束得太快,我不想要任何甚至非常小的采样率。
任何非确定性过程显然可能每次都会导致不同的内存使用量。例如,即使您执行相同的操作,也永远无法运行像Gimp或Chrome这样的大型程序并获得相同的数字两次。
但是,如果您看到一个简单的,高度确定的进程的内存使用情况发生了变化,您可能已启用了地址空间布局随机化。
这是foo.c
的一个例子:
int main() {
return 0;
}
您每次都可以看到它具有不同的内存使用情况:
$ gcc foo.c -o foo
$ /usr/bin/time -f +%M ./foo
+1144
$ /usr/bin/time -f +%M ./foo
+1048
$ /usr/bin/time -f +%M ./foo
+1060
这是因为ASLR完全启用:
$ cat /proc/sys/kernel/randomize_va_space
2
如果你把它关掉:
$ sudo tee /proc/sys/kernel/randomize_va_space <<< 0
0
你会得到相同的价值:
$ /usr/bin/time -f +%M ./foo
+1144
$ /usr/bin/time -f +%M ./foo
+1144
$ /usr/bin/time -f +%M ./foo
+1144
但是不要忘记将其重新打开以增加安全性:
sudo tee /proc/sys/kernel/randomize_va_space <<< 2