Linux中C++程序读取占用内存的两种方式:meminfo / gperftools

1 篇文章 0 订阅

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文件,可以直接看出大致用了多少内存,运行结果:

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值