存档

文章标签 ‘内存’

用google-perftool分析程序的内存/CPU使用

2012年1月3日 3 条评论

最近,用到了google-perftool分析程序的内存和CPU的使用情况,总结一下使用的一些方法和体会,分享给有需要的朋友。首先,说说google-perftool,它是由google开发的用来分析C/C++程序性能的一套工具,这里的性能分析主要包括内存和CPU两个方面,内存分析使用google-perftool所提供的tcmalloc,CPU分析使用它所提供的profiler。下面先分别介绍一下tcmalloc和profiler,然后再给出一些使用的例子,及一些使用时的注意事项。

  • 1. tcmalloc
  • tcmalloc的全称是thread cache malloc,顾名思义,它是带有thread cache的内存管理工具,具体的实现细节这里不做过多的介绍,感兴趣的朋友可以参考google官方提供的文档,或者阅读源码。这里需要注明一下tcmalloc的一些优点,和它所提供的一些分析程序内存使用的一些功能。
    tcmalloc的主要优点有两个方面,一个是内存allocate/deallocate的速度,通常情况下它的速度比glibc所提供的malloc要快;另一个方面是小内存(< =32K)的管理,它的小内存是在thread cache里面管理的,一方面减少了加锁的开销,另一方面用来表示小内存所用的额外的空间也比较小,比较节省空间。因此,对于多线程下,经常小内存的allocation/deallocation的程序(尤其多线程下使用STL比较多的程序),可以尝试使用一下tcmalloc。 阅读全文…

    linux程序分析工具介绍(三)——sar

    2011年7月10日 2 条评论

    本文要介绍的sar,是linux下用来分析系统本身运行情况的非常有用的工具。我们知道,程序在操作系统上要运行,要关注的点不外乎内存,CPU和IO(包括磁盘IO和网络IO)。我们的应用程序在操作系统中运行前,我们需要了解系统当前的内存,cpu和IO的使用状况,还需要明白我们的应用程序运行时自身所需要的内存,cpu和IO资源的情况。只有操作系统剩余的内存,cpu和IO资源能够满足应用程序所需要的,才能保证应用程序在操作系统中正常的运行。sar就是用来帮助我们了解操作系统当前内存,cpu和IO等资源的使用情况的一个非常方便的工具,下面通过具体的例子来介绍sar的使用。
    在介绍例子之前,首先需要说一下sar命令的基本用法:sar [option] [interval] [count]

  • 1. 通过sar获取系统内存使用相关信息
  • (1)内存使用情况统计:-r,通过这个选项,我们可以了解当前系统中内存的使用情况 阅读全文…

    介绍几个关于C/C++程序调试的函数

    2010年5月6日 13 条评论

    最近调试程序学到的几个挺有用的函数,分享一下,希望对用C/C++的朋友有所帮助!

    1. 调用栈系列
    下面是函数原型:

    1
    2
    3
    4
    
    #include "execinfo .h"
    int backtrace(void **buffer, int size);
    char **backtrace_symbols(void *const *buffer, int size);
    void backtrace_symbols_fd(void *const *buffer, int size, int fd);

    接下来,对上面三个函数进行介绍:
    (1)backtrace用来获得当前程序的调用栈,把结果存在buffer中。通常,我们用gdb调试程序,设置合适的断点,停下来之后,用backtrace(bt)命令,就可以看到当前的调用栈。但是,有的时候,用到条件断点的时候,gdb的功能就没有程序本身的强大了,这个时候,可以考虑在程序中调用backtrace函数,来获取调用栈。
    (2)backtrace_symbols把用backtrace获取的调用栈转换成字符串数组,以字符串数组的形式返回,使用者需要在外面释放返回的字符串数组所占用的内存
    (3)backtrace_symbols_fd把用backtrace获取的调用栈信息写到fd所指定的文件中 阅读全文…

    分类: 程序人生 标签: , , , , ,

    细说C++中的new与delete

    2010年3月25日 10 条评论

    C++中内存的动态分配与管理永远是一个让C++开发者头痛的问题,本文通过对C++中内存的动态分配释放的基本原理的介绍,让读者朋友能对C++中的内存的动态分配与释放有较为深入的理解,从而更好驾驭C++程序。

    1. 函数(Function)
    (1) operator new function

    1
    2
    
    void * ::operator new(size_t);	                //Global
    void * class-name::operator new(size_t); 	//Class

    阅读全文…

    深入浅出对象池(Object Pool)

    2010年3月4日 4 条评论

    在稍微大型一点的软件系统开发中,通常我们会用到内存池,对象池,线程池,连接池等各种各样的池(Pool),本文就来讲一讲对象池(Object Pool)。下面从四个方面来介绍一下对象池:

    1.什么是对象池(Object Pool) ?
    池(Poo), 与集合在某种意义上有些相似。 水池,是一定数量的水的集合;内存池,是一定数量的已经分配好的内存的集合;线程池,是一定数量的已经创建好的线程的集合。那么,对象池,顾名思义就是一定数量的已经创建好的对象(Object)的集合。 阅读全文…

    谈”句柄泄漏”

    2009年8月5日 没有评论

    “泄漏”是我们写程序的人老生常谈的一个话题。最为常见的就是内存泄漏(memory leak),本文介绍一种新的泄漏—句柄泄漏(handle leak)。在windows系统的程序中,我们经常会遇到句柄这个词,而且windows也抽象出了一种句柄类型HANDLE。在unix系统的系统中,句柄这个词用的不是很多。我们用另一个词描述它—文件描述符(file descriptior)。这里的文件是指广义的文件,因为在unix系统中,everything is a file。总的说来,句柄是指操作系统给我们的应用程序的进程分配的,用来标识某种资源的符号。这里的资源,可以是狭义的文件,可以是socket连接,也可以是一个对象。 阅读全文…

    CLucene源码剖析(四) 内存管理与调试

    2009年5月30日 4 条评论

    内存管理,是程序设计中一个永恒的话题,如何进行内存管理,怎么来进行内存管理?通常,如果一个项目的代码中,有比较多的new/delete或者malloc/free,很多有经验的程序员都会想到用内存池(Memory Pool),来减少内存碎片的产生,提高内存的使用效率。不过今天要讨论的重点不是内存池,今天要讨论的重点是CLucene中是如何进行内存管理的,它是怎么做到方便的内存使用情况的跟踪调试的。 阅读全文…

    CLucene源码剖析(一) 调试信息的输出

    2009年5月27日 3 条评论

    在写比较大型的项目的时候,如何使程序的调试信息能更加方便,优雅的显示出来,也是一件比较好玩的事。最好的效果就是,我在写程序的时候,调试信息越详细越好,而我写完程序,调试完成后,不用再去注释大篇的调试信息,能通过一个较小的改动就把程序中的调试信息去掉,这样就会避免应注释而可能引入新的bug,同时也节省了体力呀! 阅读全文…