How to get the process resident set size一文不仅介绍了在Windows
和Unix
(包括Linux
,BSD
,macOS
等等)操作系统上如何获取进程所使用的峰值和实时物理内存,并提供了现成的代码。在这里我只分析一下Linux
上相关功能的实现:
(1)获取峰值内存:
size_t getPeakRSS() {
struct rusage rusage;
getrusage(RUSAGE_SELF, &rusage);
return (size_t)(rusage.ru_maxrss * 1024L);
}
getrusage函数获取进程资源的使用情况。当第一个参数时RUSAGE_SELF
时,表示得到当前进程的统计数据。struct rusage
中的ru_maxrss
即表示该进程物理内存的使用峰值,因为度量单位是kilobytes
,故而需要乘以1024
。
(2)获得实时内存:
size_t getCurrentRSS() {
long rss = 0L;
FILE* fp = NULL;
if ( (fp = fopen( "/proc/self/statm", "r" )) == NULL )
return (size_t)0L; /* Can't open? */
if ( fscanf( fp, "%*s%ld", &rss ) != 1 )
{
fclose( fp );
return (size_t)0L; /* Can't read? */
}
fclose( fp );
return (size_t)rss * (size_t)sysconf( _SC_PAGESIZE);
}
/proc/self/statm
文件共包含7
个字段,第二个即是进程当前时刻占用的物理内存,单位是页面大小。要获得精确的字节数,还需通过sysconf
系统调用获得页面所占据的空间,通常为4096
。