在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用tcmalloc來(lái)替換glibc的malloc

科技綠洲 ? 來(lái)源:Linux開發(fā)架構(gòu)之路 ? 作者:Linux開發(fā)架構(gòu)之路 ? 2023-11-11 16:52 ? 次閱讀

代碼中使用tcmalloc替換malloc

我們?nèi)绾问褂胻cmalloc來(lái)替換glibc的malloc呢?

在鏈接tcmalloc的時(shí)候我們可以使用以下任意一種方式:

1.啟動(dòng)程序之前,預(yù)先加載tcmalloc動(dòng)態(tài)庫(kù)的環(huán)境變量設(shè)置:exportLD_PRELOAD="
/usr/local/lib/libtcmalloc.so"

2.在你的動(dòng)態(tài)庫(kù)鏈接的地方加入:-ltcmalloc

檢測(cè)內(nèi)存泄漏

測(cè)試代碼1:

#include < iostream >
using namespace std;
int main()
{
        int *p = new int();
        return 0;
}

編譯:g++ t.cpp -o main -ltcmalloc -g -O0

內(nèi)存泄漏檢查:env HEAPCHECK=normal ./main

結(jié)果:

root@ubuntu:/home/gaoke/test# env HEAPCHECK=normal ./main
WARNING: Perftools heap leak checker is active -- Performance may suffer
Have memory regions w/o callers: might report false leaks
Leak check _main_ detected leaks of 4 bytes in 1 objects
The 1 largest leaks:
*** WARNING: Cannot convert addresses to symbols in output below.
*** Reason: Cannot find 'pprof' (is PPROF_PATH set correctly?)
*** If you cannot fix this, try running pprof directly.
Leak of 4 bytes in 1 objects allocated from:
  @ 4007ef 
  @ 7f7895a64f45 
  @ 400719 


If the preceding stack traces are not enough to find the leaks, try running THIS shell command:

pprof ./main "/tmp/main.6712._main_-end.heap" --inuse_objects --lines --heapcheck  --edgefraction=1e-10 --nodefraction=1e-10 --gv

If you are still puzzled about why the leaks are there, try rerunning this program with HEAP_CHECK_TEST_POINTER_ALIGNMENT=1 and/or with HEAP_CHECK_MAX_POINTER_OFFSET=-1
If the leak report occurs in a small fraction of runs, try running with TCMALLOC_MAX_FREE_QUEUE_SIZE of few hundred MB or with TCMALLOC_RECLAIM_MEMORY=false, it might help find leaks more repeatably
Exiting with error code (instead of crashing) because of whole-program memory leaks

大家注意,這里有關(guān)鍵字Leak,你就得當(dāng)心這里可能存在內(nèi)存泄漏,提示

Leak of 4 bytes in 1 objects allocated from

對(duì),是有四字節(jié)的內(nèi)存泄漏,雖然你看代碼能看到指針p未釋放,但是這里你需要掌握的是在你無(wú)法直觀的通過閱讀代碼來(lái)找到內(nèi)存泄漏點(diǎn)的情況下,如何用tcmalloc工具來(lái)分析問題。

相信細(xì)心的你會(huì)注意到運(yùn)行輸出的這一行

pprof ./main "/tmp/main.6712. main -end.heap" --inuse_objects --lines --heapcheck --edgefraction=1e-10 --nodefraction=1e-10 --gv

這里就是我要重點(diǎn)講的pprof工具

google-perftool提供了一個(gè)叫pprof的工具,它是一個(gè)perl的腳本,通過這個(gè)工具,可以將google-perftool的輸出結(jié)果分析得更為直觀,輸出為text、圖片、pdf等格式。

這里我們把結(jié)果通過text的方式輸出:你只需要把剛才的--gv換成--text

pprof ./main "/tmp/main.6712. main -end.heap" --inuse_objects --lines --heapcheck --edgefraction=1e-10 --nodefraction=1e-10 --text

圖片

好了,你可以看到這里已經(jīng)很明顯了,給你提示了t.cpp文件的第五行代碼存在內(nèi)存泄漏(當(dāng)然你也可以輸出其他格式,raw,png,pdf等等,whatever,只要可以幫助你去分析問題解決問題)。

實(shí)際上項(xiàng)目中遇到的內(nèi)存泄漏問題是異常復(fù)雜的,我給的這個(gè)示例只是小試牛刀。項(xiàng)目常見的內(nèi)存泄漏點(diǎn)大家都清楚,new了但是沒有得到delete,但是要根據(jù)pprof工具對(duì)應(yīng)的函數(shù),代碼行找到對(duì)應(yīng)的泄漏點(diǎn)你可能需要花費(fèi)點(diǎn)功夫。

實(shí)際上你的大多數(shù)應(yīng)用都是以服務(wù)的方式啟動(dòng),長(zhǎng)時(shí)間處于作業(yè)/工作狀態(tài)。你需要定期來(lái)檢測(cè)下內(nèi)存泄漏情況,那么這時(shí)你需要顯示的調(diào)用接口來(lái)輸出leak情況,

示例代碼2

bool memory_check(void* arg)
{
    HeapLeakChecker::NoGlobalLeaks();
    return TRUE;
}

將上面的代碼加到你的定時(shí)檢測(cè)邏輯里,或者需要觀察的點(diǎn),那么他就會(huì)輸出示例1中的內(nèi)容,動(dòng)態(tài)的幫助你分析內(nèi)存泄漏點(diǎn)。

分析使用tcmalloc后內(nèi)存暴漲不降問題

記得幾年前我開始推廣大家使用tcmalloc后,一些同事做壓測(cè)過程中也遇到了不少麻煩。比如當(dāng)有大量數(shù)據(jù)過來(lái),new出來(lái)很多的大塊內(nèi)存,突然發(fā)現(xiàn)有時(shí)候內(nèi)存增長(zhǎng)到幾個(gè)G,開始以為是內(nèi)存泄露的問題。

圖片

先是用tcmalloc環(huán)境變量來(lái)檢查內(nèi)存泄漏沒有找到泄漏的報(bào)告,用valgrind也做了大量的測(cè)試,但是valgrind顯示沒有內(nèi)存泄露。 實(shí)際上遇到這種問題不要慌,基本上是對(duì)tcmalloc使用上的問題,你要知道默認(rèn)情況下,tcmalloc會(huì)將長(zhǎng)時(shí)間未用的內(nèi)存交還系統(tǒng)。tcmalloc_release_rate這個(gè)flag控制了這個(gè)交回頻率。你可以在運(yùn)行時(shí)通過這個(gè)語(yǔ)句強(qiáng)制這個(gè)release發(fā)生:

MallocExtension::instance()->ReleaseFreeMemory();

當(dāng)然了,你可以通過 SetMemoryReleaseRate() 來(lái)設(shè)置這個(gè)tcmalloc_release_rate. 如果設(shè)置為0,代表永遠(yuǎn)不交回。數(shù)字越大代表交回的頻率越大。一般合理的值就是設(shè)置一個(gè)0 - 10 之間的一個(gè)數(shù)。也可以通過設(shè)置環(huán)境變量 TCMALLOC_RELEASE_RATE來(lái)設(shè)置這個(gè)rate。

實(shí)際上我估計(jì)很多人看了官網(wǎng)說(shuō)的

MallocExtension::instance()->SetMemoryReleaseRate(7.0);

很疑惑,我曾經(jīng)帶著疑惑做了測(cè)試,發(fā)現(xiàn)SetMemoryReleaseRate設(shè)置9,10回收的內(nèi)存仍然是很慢的,所以后來(lái)我索性在進(jìn)程啟動(dòng)的開始設(shè)置SetMemoryReleaseRate為9,然后在new對(duì)象的時(shí)候ReleaseFreeMemory,在new對(duì)象析構(gòu)的時(shí)候ReleaseFreeMemory一次 (new出來(lái)的對(duì)象可能從new到delete的生命周期是不確定的,可能存在1天?4小時(shí)?30分鐘都有可能,而且不是頻繁的釋放和銷毀),因此這種情況下,內(nèi)存就比較及時(shí)的回收了,所以大家可以根據(jù)自己的項(xiàng)目邏輯來(lái)選擇ReleaseFreeMemory的時(shí)機(jī),最好不要頻繁的申請(qǐng)和釋放,這對(duì)tcmalloc來(lái)說(shuō)也是難受。

圖片

所以你不僅僅要關(guān)注tcmalloc申請(qǐng)大小內(nèi)存塊,還要關(guān)注內(nèi)存塊的在合適的時(shí)間及時(shí)回收,否則造成內(nèi)存占用過高。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3102

    瀏覽量

    74903
  • Glibc
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    7609
  • 動(dòng)態(tài)庫(kù)

    關(guān)注

    0

    文章

    17

    瀏覽量

    6323
  • malloc
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    166
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    當(dāng)你malloc(0)時(shí)會(huì)發(fā)生什么

    。換言之,沒事兒不要吃飽了撐的在實(shí)際編程中寫下?malloc(0)?這種天怒人怨的代碼。但是,這個(gè)無(wú)意義的問題吸引了我的興趣。因此筆者開始查閱?glibc?的源代碼,依此了解在?glibc?下
    發(fā)表于 12-01 10:42 ?583次閱讀

    Yocto Bitbake Glibc構(gòu)建失敗了怎么解決?

    我正在嘗試構(gòu)建 Yocto 映像,但在編譯 glibc 時(shí)構(gòu)建失敗。我運(yùn)行了這個(gè)命令:bitbake 精簡(jiǎn)版圖像我收到如下編譯錯(cuò)誤: | /media/ubu/LocalDisk
    發(fā)表于 03-24 08:01

    全志Tina Linux下如何編譯glibc庫(kù)

    ./env.sh 注意下信息,我們可以看到glibc生成準(zhǔn)備環(huán)境時(shí)候,已經(jīng)使用了我們指定gcc工具鏈,make工具。 編譯完成后,我們看到對(duì)應(yīng)so庫(kù) 替換glibc,例如在我們測(cè)試demo,修改
    發(fā)表于 06-02 10:00

    使用全志方案遇到glibc庫(kù)版本低以及編譯報(bào)錯(cuò)的解決方法

    env.sh腳本 env.sh ./env.sh 注意下信息,我們可以看到glibc生成準(zhǔn)備環(huán)境時(shí)候,已經(jīng)使用了我們指定gcc工具鏈,make工具。 編譯完成后,我們看到對(duì)應(yīng)so庫(kù) 替換glibc
    發(fā)表于 06-25 09:48

    通過實(shí)現(xiàn)一個(gè)簡(jiǎn)單的malloc來(lái)描述malloc背后的機(jī)制

    任何一個(gè)用過或?qū)W過C的人對(duì)malloc都不會(huì)陌生。大家都知道malloc可以分配一段連續(xù)的內(nèi)存空間,并且在不再使用時(shí)可以通過free釋放掉。但是,許多程序員對(duì)malloc背后的事情并不熟悉,許多人
    的頭像 發(fā)表于 01-27 23:30 ?4405次閱讀
    通過實(shí)現(xiàn)一個(gè)簡(jiǎn)單的<b class='flag-5'>malloc</b><b class='flag-5'>來(lái)</b>描述<b class='flag-5'>malloc</b>背后的機(jī)制

    在嵌入式設(shè)備中使用Malloc Hook的試驗(yàn)

    在嵌入式設(shè)備中,計(jì)劃使用malloc hook來(lái)進(jìn)行內(nèi)存跟蹤,以便測(cè)試程序的內(nèi)存使用。 試驗(yàn)1: 在程序開始,增加了mtrace函數(shù),定義環(huán)境變量MALLOC_TRACE。 發(fā)現(xiàn)了
    發(fā)表于 04-02 14:37 ?777次閱讀

    glibc內(nèi)存管理存在的共性問題及解決方法

    引言 對(duì)于嵌入式設(shè)備來(lái)說(shuō),用戶態(tài)內(nèi)存管理是一項(xiàng)基礎(chǔ)功能,目前主流的用戶態(tài)內(nèi)存管理庫(kù)有glibc、uclibc、tcmalloc、jemalloc等。 本文基于glibc2.17版本進(jìn)行分析,圍繞
    的頭像 發(fā)表于 06-18 14:50 ?3543次閱讀

    Glibc內(nèi)存管理之Ptmalloc2源代碼分析

    Glibc內(nèi)存管理之Ptmalloc2源代碼分析
    發(fā)表于 07-29 09:20 ?24次下載

    malloc和free簡(jiǎn)介及實(shí)現(xiàn)方式說(shuō)明

    malloc 分配指定大小的內(nèi)存空間,返回一個(gè)指向該空間的指針。大小以字節(jié)為單位。返回 void* 指針,需要強(qiáng)制類型轉(zhuǎn)換后才能引用其中的值。 free 釋放一個(gè)由 malloc 所分配的內(nèi)存空間。ptr 指向一個(gè)要釋放內(nèi)存的內(nèi)存塊,該指針應(yīng)當(dāng)是之前調(diào)用的
    的頭像 發(fā)表于 05-14 09:56 ?4754次閱讀
    <b class='flag-5'>malloc</b>和free簡(jiǎn)介及實(shí)現(xiàn)方式說(shuō)明

    如何調(diào)試glibc

    對(duì)于GNU工具鏈開發(fā)者而言,為了獲取到一些動(dòng)態(tài)重定位、函數(shù)符號(hào)解析的信息,開發(fā)者通常需要對(duì)Glibc中的動(dòng)態(tài)鏈接器程序進(jìn)行調(diào)試,一般會(huì)利用gdb來(lái)進(jìn)行調(diào)試
    的頭像 發(fā)表于 05-11 09:03 ?1066次閱讀

    jemalloc分配機(jī)制的介紹及其優(yōu)化實(shí)踐

    C/C++通過libc做內(nèi)存分配。glibc中默認(rèn)的分配機(jī)制是ptmalloc。除此之外,還有眾多的不同側(cè)重的優(yōu)化,例如tcmalloc,jemalloc。
    的頭像 發(fā)表于 05-30 09:12 ?1424次閱讀
    jemalloc分配機(jī)制的介紹及其優(yōu)化實(shí)踐

    面試題:malloc(0)會(huì)發(fā)生什么?

    至此,我們就可以根據(jù)這些計(jì)算出使用 glibc 在我們的電腦上運(yùn)行時(shí) malloc 出的最小空間的大小了。計(jì)算完后,還可以根據(jù) malloc_usable_size 判斷自己的計(jì)算是否正確,樣例代碼如下
    的頭像 發(fā)表于 10-31 16:27 ?684次閱讀
    面試題:<b class='flag-5'>malloc</b>(0)會(huì)發(fā)生什么?

    TCMalloc 的架構(gòu)設(shè)計(jì)細(xì)節(jié)

    本節(jié)將專注于TCMalloc 的架構(gòu)設(shè)計(jì)細(xì)節(jié),來(lái)整體看一下TCMalloc 的設(shè)計(jì)特性。 主要的幾個(gè)特性如下: 高性能。大多數(shù)對(duì)象的分配和釋放都不需要產(chǎn)生太多的競(jìng)爭(zhēng),因?yàn)?b class='flag-5'>tcmalloc
    的頭像 發(fā)表于 11-09 10:18 ?583次閱讀
    <b class='flag-5'>TCMalloc</b> 的架構(gòu)設(shè)計(jì)細(xì)節(jié)

    malloc跟free的源碼分析

    malloc 本文梳理了一下malloc跟free的源碼。malloc()函數(shù)在源代碼中使用宏定義為public_mALLOc()。public_m
    的頭像 發(fā)表于 11-09 11:39 ?1904次閱讀

    如何實(shí)現(xiàn)一個(gè)malloc

    甚至把malloc當(dāng)做操作系統(tǒng)所提供的系統(tǒng)調(diào)用或C的關(guān)鍵字。實(shí)際上,malloc只是C的標(biāo)準(zhǔn)庫(kù)中提供的一個(gè)普通函數(shù),而且實(shí)現(xiàn)malloc的基本思想并不復(fù)雜,任何一個(gè)對(duì)C和操作系統(tǒng)有些許了解的程序員都可以很容易理解。 這篇文章通過
    的頭像 發(fā)表于 11-13 14:31 ?992次閱讀
    如何實(shí)現(xiàn)一個(gè)<b class='flag-5'>malloc</b>
    主站蜘蛛池模板: 国产爱搞 | 久久精品屋 | 欧美黄视频在线观看 | 黄色大片在线免费观看 | www色网站 | 亚洲国产精品自在现线让你爽 | 国产小视频在线高清播放 | 狠狠狠操 | 男人和女人做爽爽视频在线观看 | 亚洲伊人久久大香线蕉影院 | 激情6月丁香婷婷色综合 | 免费欧美黄色 | 中文字幕一区二区三区在线观看 | 色播影院性播影院私人影院 | 2017天天干| 亚洲国产综合人成综合网站00 | 国产哺乳期奶水avav | 日韩一级特黄 | 最近免费hd | 亚洲视频国产 | 日本一区免费看 | 毛片免费看网站 | 狠狠色噜噜狠狠狠狠98 | 国产一级又色又爽又黄大片 | 天天操夜夜逼 | 在线天堂资源www中文在线 | 人人澡 人人澡 人人看 | www.九色.com| 婷婷九月 | 123综合网在线 | 欧美极品| 欧美四虎影院 | 色综合国产 | 欧美精品videosex性欧美 | 中日韩毛片 | 女人张开腿男人猛桶视频 | 亚洲狠狠97婷婷综合久久久久 | 六月丁香婷婷激情国产 | 四虎永久精品免费网址大全 | 日本一本视频 | 成人一级毛片 |