1. 利用/proc/meminfo文件
直接读取系统当前可用内存,在程序执行前和执行中进行调用,系统可用内存的减少近似表示程序占用的内存。
直接调用下面这个函数:
int GetSysMemInfo() { //获取系统当前可用内存
int mem_free = -1;//空闲的内存,=总内存-使用了的内存
int mem_total = -1; //当前系统可用总内存
int mem_buffers = -1;//缓存区的内存大小
int mem_cached = -1;//缓存区的内存大小
char name[20];
FILE *fp;
char buf1[128], buf2[128], buf3[128], buf4[128], buf5[128];
int buff_len = 128;
fp = fopen("/proc/meminfo", "r");
if (fp == NULL) {
std::cerr << "GetSysMemInfo() error! file not exist" << std::endl;
return -1;
}
if (NULL == fgets(buf1, buff_len, fp) ||
NULL == fgets(buf2, buff_len, fp) ||
NULL == fgets(buf3, buff_len, fp) ||
NULL == fgets(buf4, buff_len, fp) ||
NULL == fgets(buf5, buff_len, fp)) {
std::cerr << "GetSysMemInfo() error! fail to read!" << std::endl;
fclose(fp);
return -1;
}
fclose(fp);
sscanf(buf1, "%s%d", name, &mem_total);
sscanf(buf2, "%s%d", name, &mem_free);
sscanf(buf4, "%s%d", name, &mem_buffers);
sscanf(buf5, "%s%d", name, &mem_cached);
int memLeft = mem_free + mem_buffers + mem_cached;
return memLeft;
}
2. 利用gperftools 工具查看内存占用
Git地址:https://github.com/gperftools/gperftools (originally Google Performance Tools)
2.1下载安装libunwind
http://mirror.yongbok.net/nongnu/libunwind/ 下载最新版libunwind
./configure --prefix=/home/ztj/software/tools/libunwind/ CFLAGS=-U_FORTRIFY_SOURCE
#(prefix后跟你设置的安装路径,不设置则为默认路径)
make
make install
2.2下载安装gperftools
https://github.com/gperftools/gperftools
./configure --prefix=/home/ztj/software/tools/gperftools LDFLAGS=-L/home/ztj/software/tools/libunwind/lib CPPFLAGS=-I/home/ztj/software/tools/libunwind/include
#(prefix后跟你设置的安装路径,不设置则为默认路径)
make
make install
2.3 程序中调用
#include <gperftools/heap-profiler.h>
//如果找不到,就从设置的安装路径里找,或CMakeLists.txt中加include_directories头文件
int main() {
HeapProfilerStart("test"); //开始监测
... //你的程序
HeapProfilerStop();//停止监测
}
2.4 CMakeLists.txt中链接库文件:
SET(LIB_LIST ${LIB_LIST}
/home/ztj/software/tools/gperftools/lib/libprofiler.so
/home/ztj/software/tools/gperftools/lib/libtcmalloc.so)
add_executable(test src/main.cpp)
target_link_libraries(test ${LIB_LIST})
2.5 运行前设置环境变量
终端中:
export HEAP_PROFILE_ALLOCATION_INTERVAL=1024000
#表示新增多少申请内存写一次文件(是指申请的总内存,包括已经释放的,单位,字节)
2.6 运行程序
根据上面的设置,每申请1024000字节内存,则会保存test.0001.heap文件,可以直接看出大致用了多少内存,运行结果: