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

Daly的游戲人生

替代系統malloc/new--選擇合適的內存跟蹤方案

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

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

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

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

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

 有時候valgrind的效率是個問題(尤其生產環境),這種方案有其價值所在, 就是代碼看上去比較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其實很復雜,要考慮線程安全等各種問題,性能到頭來可能更差。google 的tcmalloc,  facebook使用的jemalloc.   多線程下性能較好,可以考慮使用。
     缺點:筆者嘗試過。tcmalloc不能正確用valgrind,只能用自帶gperftools(運行中會core)
                 jemalloc可以使用valgrind,不過還沒完全驗證是否都準確。
tcmalloc相關:
    在64位系統上要裝libunwind, 對x86-64架構使用還有些問題

源碼包的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這個庫,這個庫又有版本問題,各種囧啊....
筆者試過系統x86-64, freebsd,用靜態鏈接。實際用了一下,問題很多很折騰,等他fix了再說吧.

windows下可以參考:

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

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

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

posted on 2012-07-02 13:01 Daly 閱讀(7525) 評論(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>
            欧美激情a∨在线视频播放| 亚洲欧美激情视频在线观看一区二区三区| 欧美一级片在线播放| 欧美人成免费网站| 亚洲国产91| 亚洲国产精品成人久久综合一区| 久久乐国产精品| 国语自产精品视频在线看抢先版结局| 新狼窝色av性久久久久久| 日韩网站在线观看| 欧美日精品一区视频| 在线综合亚洲| 在线亚洲欧美专区二区| 欧美午夜不卡在线观看免费 | 夜夜嗨av色一区二区不卡| 日韩视频在线你懂得| 亚洲国产裸拍裸体视频在线观看乱了中文| 久久综合久久美利坚合众国| 伊人久久大香线| 欧美搞黄网站| 久久精品水蜜桃av综合天堂| 亚洲精品乱码久久久久久黑人| 欧美高清视频一区二区| 欧美成ee人免费视频| 夜夜夜久久久| 性欧美精品高清| 影音先锋日韩资源| 亚洲片在线观看| 欧美色图天堂网| 久久成人18免费观看| 久久久久久久网| 亚洲精品男同| 亚洲一区二区免费看| 亚洲人成在线影院| 一本色道久久综合亚洲精品小说| 国产毛片一区二区| 亚洲免费视频在线观看| 久久一区二区视频| 一区二区av在线| 欧美一级在线视频| 在线免费观看视频一区| 亚洲天堂网在线观看| 国产综合久久久久影院| 亚洲电影观看| 国产精品美腿一区在线看| 欧美国产一区二区三区激情无套| 欧美日韩国产不卡| 久久久午夜电影| 欧美—级a级欧美特级ar全黄| 亚洲天堂av图片| 久久福利一区| 亚洲与欧洲av电影| 欧美成人免费va影院高清| 欧美一区二区久久久| 欧美日韩ab| 老司机免费视频一区二区| 欧美日韩亚洲一区二区三区| 久久精品夜色噜噜亚洲a∨ | 最新日韩在线视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 在线成人小视频| 亚洲免费在线播放| 亚洲视屏一区| 欧美激情国产日韩| 欧美成黄导航| 国产尤物精品| 久久精品道一区二区三区| 先锋影音久久久| 欧美视频免费在线观看| 蜜臀久久99精品久久久久久9| 国产精品国产三级国产普通话99| 亚洲欧洲中文日韩久久av乱码| 黄色成人免费网站| 久久成人综合视频| 久久国产精品久久国产精品| 国产精品久久91| 一区二区av在线| 宅男精品导航| 欧美午夜精品久久久久久人妖| 亚洲激情不卡| 亚洲另类自拍| 欧美精品1区2区3区| 美日韩精品免费| 影音先锋在线一区| 久久婷婷麻豆| 亚洲成人在线网站| 亚洲淫性视频| 国产精品日韩欧美综合| 亚洲一区在线免费观看| 午夜亚洲性色福利视频| 国产模特精品视频久久久久 | 亚洲电影免费| 免费欧美在线视频| 日韩视频免费观看高清在线视频 | 国产欧美精品在线播放| 亚洲美女视频在线免费观看| 亚洲欧美综合v| 国产视频欧美| 久久久久国产一区二区三区四区| 午夜日韩福利| 在线观看一区二区视频| 免费成人黄色片| 亚洲伦理在线免费看| 午夜国产精品影院在线观看| 国产精品99免费看 | 欧美三级日韩三级国产三级| 午夜精品久久久久久久久| 欧美成人在线免费视频| 亚洲欧美成人| 亚洲精品国产精品国产自| 国产精品99一区二区| 久久久久久久久久久久久9999| 亚洲精品资源美女情侣酒店| 久久一区二区三区四区| 亚洲一区二区三区在线观看视频| 在线精品国产成人综合| 欧美性天天影院| 女主播福利一区| 新片速递亚洲合集欧美合集| 亚洲免费高清视频| 欧美77777| 欧美在线网站| 亚洲欧美视频在线观看| 一本一本大道香蕉久在线精品| 红桃视频国产精品| 国产亚洲精品资源在线26u| 欧美日韩另类视频| 欧美成人免费小视频| 久久三级视频| 欧美与欧洲交xxxx免费观看| 亚洲影院在线观看| 日韩视频中文| 99成人免费视频| 日韩亚洲一区在线播放| 亚洲黄色影院| 亚洲国产精品成人一区二区| 麻豆av一区二区三区久久| 久久五月激情| 久久蜜桃资源一区二区老牛| 欧美在线一二三区| 欧美一区二区在线免费观看 | 国产亚洲日本欧美韩国| 国产精品入口麻豆原神| 国产精品国产三级国产普通话蜜臀| 欧美激情一区二区久久久| 欧美mv日韩mv国产网站| 免费亚洲电影| 欧美老女人xx| 欧美日韩综合一区| 欧美亚洲成人免费| 国产精品香蕉在线观看| 国产精品美女久久久久久免费| 国产精品国产| 国产午夜精品一区二区三区欧美 | 国产亚洲欧美一区二区| 狠狠色狠狠色综合日日小说| 狠狠色综合播放一区二区| 激情视频一区| 亚洲精品欧美专区| 在线亚洲欧美| 欧美一级理论片| 毛片一区二区三区| 欧美激情视频给我| 亚洲每日在线| 亚洲在线视频一区| 久久久99精品免费观看不卡| 免费欧美日韩国产三级电影| 欧美日韩午夜在线| 国产婷婷色综合av蜜臀av| 国产一区日韩欧美| 亚洲免费电影在线| 欧美一区二区三区在线看| 久久亚洲综合网| 亚洲毛片av| 欧美综合77777色婷婷| 欧美高清在线视频| 国产精品美女久久久久久久 | 国产一区二区| 亚洲精品免费观看| 欧美在线观看视频| 欧美高清视频www夜色资源网| 一本色道久久综合亚洲精品高清 | 亚久久调教视频| 欧美成年人视频网站欧美| 国产精品视频yy9299一区| 国产综合久久久久久鬼色| 宅男在线国产精品| 久久在线精品| 亚洲免费小视频| 欧美精品在线极品| 韩国av一区二区| 亚洲夜晚福利在线观看| 欧美高清视频在线| 欧美一区二区视频观看视频| 欧美伦理91i| 亚洲国产老妈| 久久久www| 亚洲永久字幕| 国产精品a久久久久| 亚洲精品国产品国语在线app|