青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Daly的游戲人生

替代系統(tǒng)malloc/new--選擇合適的內(nèi)存跟蹤方案

 
替代系統(tǒng)自帶的malloc/new原因無非兩個: 
reason 1. 做內(nèi)存profile或查找問題   
reason 2. 自定義的分配方案提高性能

不過文章[1]中說明了,替代全局new不是一個好做法. 其實要達到以上兩點目的,筆者認(rèn)為用valgrind工具鏈就可以了。

解決方案:
1. 用valgrind和massif
     valgrind的memcheck做內(nèi)存泄露和bug的查找, 里面的massif工具包做內(nèi)存性能profile, 足矣。比自己山寨的一個profiler要好。
     注意:tcmalloc目前還不能很好支持valgrind,  實測中jemalloc可以

2.  linux下C的程序可以用wrap的方式(相當(dāng)于python的decorator)
     編譯加上選項:gcc -Wl,-wrap,malloc
     可以做到對malloc這個函數(shù),linker會調(diào)用__wrap_malloc代替之, 若要調(diào)用原來的malloc函數(shù)__real_malloc
     缺點:依賴于編譯器支持; 對c++的new不起作用 --> 不實用
     啟示:這個方法作為function裝飾器,對于調(diào)試別的問題倒有幫助。(例如不改變函數(shù)的情況下,wrap一層,輸出些調(diào)試信息)
3. 用__malloc_hook
    參考: http://linux.die.net/man/3/__malloc_hook
     #include <malloc.h>
     void *(*__malloc_hook)(size_t size, const void *caller);
     缺點:依賴GNU編譯工具鏈;  容易死循環(huán)(想利用原有malloc,要參考例子中,把原__malloc_hook變量保存起來使用,并恢復(fù)現(xiàn)場)

4. LD_PRELOAD注入.so ,替代原
     環(huán)境變量LD_PRELOAD指定程序運行時優(yōu)先加載的動態(tài)連接庫,這個動態(tài)鏈接庫中的符號優(yōu)先級是最高的。標(biāo)準(zhǔn)C的各種函數(shù)都是存放在libc.so.6的文件中,在程序運行時自動鏈接。使用LD_PRELOAD后,自己編寫的malloc的加載順序高于glibc中的malloc,這樣就實現(xiàn)了替換。用法 LD_PRELOAD=" ./mymalloc.so"
      缺點:在生產(chǎn)環(huán)境不現(xiàn)實。因為LD_PRELOAD相當(dāng)于庫注入,有安全性問題,是必須禁止的。(生產(chǎn)環(huán)境很多時候用-static連接)
5. 用宏或另外的函數(shù)替代new/malloc
   比如定義一個宏或者指定的函數(shù),規(guī)定所有的分配釋放都調(diào)用他。這樣相當(dāng)于給項目引入了額外的代碼規(guī)則(而且是一立項就要遵循這個規(guī)則,否則該方法無效),不能很自然的new/delete, 如果分配和釋放調(diào)用得不一致,會產(chǎn)生問題的。某產(chǎn)品組就是用宏,然后加上__FILE__, __LINE__之類的信息。

 有時候valgrind的效率是個問題(尤其生產(chǎn)環(huán)境),這種方案有其價值所在, 就是代碼看上去比較ugly罷了

   用宏的例子:
   #define _New(Type, Catergory)                    (Type*)MyMemController::New((new Type), #Type, 1, sizeof(Type),   Catergory, __FILE__, __LINE__, false)
   #define _NewArray(Type, N, Catergory)          (Type*)MyMemController::New((new Type[N]), #Type, N, sizeof(Type)*(N), Catergory, __FILE__, __LINE__, true)

   
MALLOC的替代品:
     自己寫一個malloc其實很復(fù)雜,要考慮線程安全等各種問題,性能到頭來可能更差。google 的tcmalloc,  facebook使用的jemalloc.   多線程下性能較好,可以考慮使用。
     缺點:筆者嘗試過。tcmalloc不能正確用valgrind,只能用自帶gperftools(運行中會core)
                 jemalloc可以使用valgrind,不過還沒完全驗證是否都準(zhǔn)確。
tcmalloc相關(guān):
    在64位系統(tǒng)上要裝libunwind, 對x86-64架構(gòu)使用還有些問題

源碼包的INSTALL文檔里面也提到了這個問題。
 CAUTION: if you install libunwind from the url above, be aware that
   you may have trouble if you try to statically link your binary with
   perftools: that is, if you link with 'gcc -static -lgcc_eh ...'.
   This is because both libunwind and libgcc implement the same C++
   exception handling APIs, but they implement them differently on
   some platforms.  This is not likely to be a problem on ia64, but
   may be on x86-64.

主要是64位機frame-pointer的影響, 他的profile工具里的backtrace用libunwind這個庫,這個庫又有版本問題,各種囧啊....
筆者試過系統(tǒng)x86-64, freebsd,用靜態(tài)鏈接。實際用了一下,問題很多很折騰,等他fix了再說吧.

windows下可以參考:

jemalloc暫時未發(fā)現(xiàn)有什么兼容性問題,運行得挺好的。
 
Reference
[1] <不要重載全局operator new>

[2] effective c++條款50:了解new和delete的合理替換時機

[3] 游戲引擎中的內(nèi)存分配策略
[4] 更好的內(nèi)存管理jemalloc
[5] tcmalloc官網(wǎng)(gperftools)

posted on 2012-07-02 13:01 Daly 閱讀(7522) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久不射中文字幕| 国产精品久久久久影院亚瑟| 亚洲激情成人| 午夜精品久久久久久久白皮肤| 欧美国产亚洲精品久久久8v| 久久久777| 久久亚洲综合网| 卡一卡二国产精品| 欧美高清视频| 亚洲精品欧美日韩专区| 日韩天堂在线视频| 亚洲小视频在线观看| 久久成人国产| 老司机午夜精品视频| 欧美精品色综合| 国产精品香蕉在线观看| 一区二区在线视频| 亚洲久久在线| 欧美一二三视频| 米奇777超碰欧美日韩亚洲| 亚洲国产一区在线| 亚洲一级特黄| 麻豆91精品| 国产精品亚洲综合色区韩国| 亚洲第一级黄色片| 午夜精品福利一区二区三区av | 亚洲国产欧美国产综合一区| 亚洲欧洲综合另类| 99国内精品久久| 久久激情综合| 欧美视频在线看| 亚洲国产成人久久综合| 欧美亚洲视频| 亚洲黄色在线| 久久精品日产第一区二区三区| 欧美日韩国产不卡在线看| 国内在线观看一区二区三区| 亚洲色图自拍| 91久久精品视频| 久久亚洲一区二区| 国产午夜精品全部视频在线播放| 一区二区不卡在线视频 午夜欧美不卡'| 欧美综合国产| 99国产精品久久久| 欧美v国产在线一区二区三区| 国产日韩欧美综合一区| 亚洲性人人天天夜夜摸| 亚洲韩国精品一区| 久久综合五月天婷婷伊人| 国产日韩欧美三区| 午夜在线精品偷拍| 一区二区日韩| 欧美乱在线观看| 亚洲国产日韩在线一区模特| 久久精品亚洲一区二区三区浴池| 日韩视频在线观看| 免费不卡欧美自拍视频| 国产片一区二区| 国产精品久久久久免费a∨大胸| 亚洲精品日韩激情在线电影| 麻豆精品精华液| 欧美伊人久久| 国产亚洲欧美激情| 欧美一区91| 亚洲一区二区三| 国产精品久久一级| 一本一本久久a久久精品综合麻豆| 欧美11—12娇小xxxx| 久久久久久久高潮| 国产视频观看一区| 久久综合中文字幕| 久久精品国产亚洲高清剧情介绍| 国产亚洲综合在线| 午夜在线精品偷拍| 亚洲午夜久久久| 国产日韩欧美视频| 久久久一二三| 免费在线看一区| 亚洲无线视频| 欧美亚洲日本国产| 在线观看日产精品| 亚洲黄色一区二区三区| 欧美色另类天堂2015| 午夜精品久久| 欧美一区二区在线免费观看| 亚洲成人在线观看视频| 欧美韩国在线| 国产精品video| 久久婷婷丁香| 欧美劲爆第一页| 小黄鸭精品密入口导航| 久久久久综合一区二区三区| 亚洲精品乱码久久久久久蜜桃91 | 午夜影院日韩| 久久av一区二区| 99视频国产精品免费观看| 亚洲网站视频| 永久免费视频成人| 亚洲最新视频在线| 一区二区三区在线不卡| 亚洲激情影院| 国产一区欧美| 一本色道久久综合亚洲精品按摩 | 久久国产欧美精品| 亚洲美女在线观看| 亚洲免费网址| 日韩亚洲视频在线| 欧美一区二区三区在线观看视频 | 欧美大片免费观看在线观看网站推荐 | 欧美三级午夜理伦三级中文幕| 午夜精品久久久久久| 美乳少妇欧美精品| 久久国产精品一区二区三区四区| 欧美1区2区| 久久中文欧美| 国产日韩欧美在线观看| 一区二区激情小说| 亚洲精品网站在线播放gif| 久久国产毛片| 久久精品日韩一区二区三区| 国产精品theporn| 日韩亚洲成人av在线| 亚洲人成网站影音先锋播放| 久久精品视频免费播放| 久久精彩视频| 国产日韩欧美综合在线| 午夜精品久久久久久久久久久久久 | 国产久一道中文一区| 亚洲精品美女在线观看| 亚洲高清久久久| 久久久精品性| 久久裸体艺术| 国模精品娜娜一二三区| 亚洲欧美中文在线视频| 性刺激综合网| 国产精品二区在线观看| 日韩亚洲视频| 亚洲先锋成人| 国产精品激情偷乱一区二区∴| 99视频在线观看一区三区| 一个人看的www久久| 欧美日韩一区二区视频在线观看 | 国产日韩精品在线| 亚洲欧美文学| 久久激情婷婷| 国产一区二区三区高清在线观看| 午夜精品美女自拍福到在线| 欧美综合二区| 在线国产精品一区| 老司机成人在线视频| 欧美国产日本| 日韩图片一区| 国产精品久久久对白| 亚洲欧美成人精品| 久久久人成影片一区二区三区 | 亚洲特级毛片| 国产精品午夜视频| 羞羞答答国产精品www一本| 久久精品国产亚洲一区二区三区| 国产日韩欧美一区二区三区四区| 欧美在线高清| 欧美电影打屁股sp| 9色国产精品| 国产乱码精品1区2区3区| 久久精品免费观看| 亚洲欧洲中文日韩久久av乱码| 亚洲伊人久久综合| 可以看av的网站久久看| 亚洲国产高潮在线观看| 亚洲一区国产一区| 亚洲精品视频在线观看网站| 欧美精品久久一区二区| 一区二区三区视频观看| 久久久www成人免费毛片麻豆| 亚洲大胆在线| 国产精品va在线播放| 久久免费的精品国产v∧| 日韩午夜中文字幕| 久久综合中文| 亚洲尤物视频网| 亚洲国产高清在线| 国产精品欧美久久久久无广告| 久久全球大尺度高清视频| 一区二区三区福利| 欧美激情网站在线观看| 欧美亚洲日本国产| 99视频精品在线| 狠狠综合久久| 国产精品爽黄69| 欧美激情片在线观看| 欧美伊人影院| 亚洲一区二区三区在线观看视频| 欧美激情一区二区三区在线视频 | 欧美日韩另类综合| 久久性色av| 欧美中文日韩| 亚洲欧美日韩爽爽影院| 日韩午夜在线视频| 亚洲娇小video精品| 免费亚洲电影|