最近,用到了google-perftool分析程序的内存和CPU的使用状况,总结一下使用的一些方法和体会,分享给有须要的朋友。首先,说说google-perftool,它是由google开发的用来分析C/C++程序性能的一套工具,这里的性能分析主要包括内存和CPU两个方面,内存分析使用google-perftool所提供的tcmalloc,CPU分析使用它所提供的profiler。下面先分别介绍一下tcmalloc和profiler,而后再给出一些使用的例子,及一些使用时的注意事项。程序员
tcmalloc的全称是thread cache malloc,顾名思义,它是带有thread cache的内存管理工具,具体的实现细节这里不作过多的介绍,感兴趣的朋友能够参考google官方提供的文档,或者阅读源码。这里须要注明一下tcmalloc的一些优势,和它所提供的一些分析程序内存使用的一些功能。
tcmalloc的主要优势有两个方面,一个是内存allocate/deallocate的速度,一般状况下它的速度比glibc所提供的malloc要快;另外一个方面是小内存(< =32K)的管理,它的小内存是在thread cache里面管理的,一方面减小了加锁的开销,另外一方面用来表示小内存所用的额外的空间也比较小,比较节省空间。所以,对于多线程下,常常小内存的allocation/deallocation的程序(尤为多线程下使用STL比较多的程序),能够尝试使用一下tcmalloc。
除了在allocate/deallocate内存时的优化外,tcmalloc还提供了heapcheck和heapprofile的功能。heapcheck主要被用来检查程序中是否有内存泄露,在哪里泄露。相信内存泄露这个话题,永远是让全部C/C++程序都很是蛋疼的问题,有了tcmalloc的帮助,也许一切会变得简单一些,会有点事半功倍的效果。tcmalloc另一个功能是heapprofile。先来讲一下profile这个词,它的本意是“描绘…轮廓”,我一直以为这个词是一个很伟大的词,用在sns中,它表示用来描绘用户的那些特征、属性,也有叫用户画像的。用在这里呢,heapprofile,顾名思义,它就是描绘程序的heap轮廓,经过这样一个过程,咱们就能知道,程序的heap里在每一时刻都有些啥东东。有了profile的结果,它能够帮助咱们定位内存泄露,帮助咱们发现一些频繁allocate内存的地方,以此来作一些优化。
(关于程序中的heap和stack,不了解的朋友,能够到网上搜一下:程序的地址空间分布)shell
关于google-perftool的使用,整体上来说有如下三种方式:api
下面是静态库的使用方法:性能优化
1 2 |
gcc [...] -o myprogram -ltcmalloc env HEAPCHECK=normal ./myprogram |
1 2 |
gcc [...] -o myprogram -ltcmalloc env HEAPPROFILE=./myprogram.hprof ./myprogram |
1 2 |
gcc [...] -o myprogram -lprofiler env CPUPROFILE=./myprogram.prof ./myprogram |
经过上面的方法,能够生成google-perftool原始的输出结果。另外,google-perftoolg还提供了一个叫pprof的工具,它是一个perl的脚本,经过这个工具,能够将google-perftool的输出结果分析得更为直观,输出为图片、pdf等格式。多线程
最后,补充一点,要用google-perftool来分析程序,必须保证程序能正常退出。因此,这里也想多说几句,我我的以为,好的C/C++程序员,应该作到本身的程序都能优雅退出,这是最基本的要求。这里所谓的优雅退出,指的是退出的时候把该释放的资源释放掉,且保证程序退出时不挂。app