編寫服務器程序時,需要頻繁的申請和釋放內存,長時間運行會產生大量的內存碎片,這就導致即使當前系統中的閑置內存還足够多,但也無法申請到大的連續可用的內存塊,因為此時的物理內存已經千瘡百孔像個馬蜂窩。此外,在高並發的情况下頻繁的malloc/free也是一筆額外的cpu負擔。

如何解决內存碎片呢?

在這裏給大家安利一個舉手之勞的好辦法——重啟應用

如果是客戶端程序,可以通過退出重啟的方式解决內存碎片的問題;不過對於服務器應用而言這樣操作的風險比較大,但如果覺得自己命硬也不妨嘗試一下。

不好意思上面寫錯了,重新安利一下。

通常情况下服務器程序會在內部實現一套自己的內存分配和管理機制,用於解决內存碎片和速度的問題。比如分布式緩存服務memcached就是用Slab Allocator來分配和管理內存。但對於大部分應用而言,自己單獨造輪子的成本還是比較高的,一旦管理不善,可能會引入更多的問題。如果有現成的開源內存管理庫可用,是再好不過的。相較於memcached,另一個高速緩存redis就是拿來主義直接使用開源的內存管理庫,內部集成了google的tcmalloc和jemalloc。redis的windows版本是用的是jemalloc庫。

說了這麼多廢話,回歸正題,如何調用jemalloc庫,本案例使用的是x86靜態庫。

一、下載地址

1、jemalloc各種庫下載地址

2、jemalloc頭文件下載地址

如下圖:

請根據個人胃口下載不同的jemalloc庫,但include.zip必須要下載。

二、開發環境准備

開發環境:vs2017或vs2015

1、建立一個控制臺工程test_jemalloc

確保有main函數啊!

2、配置include目錄

下載 include.zip到指定目錄,並解壓拷貝到test_jemalloc工程下。

如果不是在當前工程下,則需要寫好絕對路徑。

3、配置預處理器

因為本案例使用的是靜態庫,則需要在配置中加入如下宏定義(如果使用的是動態庫則無需配置)。

JEMALLOC_EXPORT=

JEMALLOC_STATIC

三、測試源碼


#include <stdio.h>
#include <time.h> // for clock()
#include <assert.h>
#include "jemalloc/jemalloc.h" // “配置屬性”->“C/C++”->“常規”->“附加包含目錄” //#define USE_JEMALLOC // 重載malloc/free
#ifdef USE_JEMALLOC
#define malloc(size) je_malloc(size)
#define calloc(count,size) je_calloc(count,size)
#define realloc(ptr,size) je_realloc(ptr,size)
#define free(ptr) je_free(ptr)
#endif // 當前使用的是jemalloc靜態庫
#ifdef _DEBUG
#pragma comment(lib,"jemalloc-x86-Debug-static.lib")
#else
#pragma comment(lib,"jemalloc-x86-Release-static.lib")
#endif int main()
{
int i = 0;
int iCount = 50000;
int iSize = 1000; // malloc
clock_t cStart = ::clock();
for (i = 0; i < iCount; i++)
{
void* pMem = malloc(iSize);
assert(pMem);
free(pMem);
}
clock_t cSpan1 = ::clock() - cStart; // jemalloc
cStart = ::clock();
for (i = 0; i < iCount; i++)
{
void* pMem = je_malloc(iSize);
assert(pMem);
je_free(pMem);
}
clock_t cSpan2 = ::clock() - cStart; printf("malloc span time = %d, jemalloc span time = %d\r\n", cSpan1, cSpan2); printf("press any key exit......\r\n");
getchar();
return 0;
}

感謝您的閱讀!

最全Windows版本jemalloc庫(5.2.1)及其使用:包含動態庫和靜態庫、x86版本和x64版本、debug版本和release版本的更多相關文章

  1. MFC下debug改成release版本出現問題及解决辦法

    自己在debug下成功運行了自己寫的測試自己寫第三方庫的程序,這裏有用到opencv庫,所以同時用到了自己的庫和opencv的庫,需求因為要進行速度的測試,是想要把debug改成release版本,這 ...

  2. 【原】IOS合並lib(.a)庫的終極可用方法(可用於解决duplicate symbol靜態庫沖突)

    網上流傳了太多關於合並lib庫的方法,自己也嘗試過,但大多失敗.有感於這種急於解决問題,經過百般嘗試後依舊無果的無奈心情,小翁在這裏用一個實例來完整闡述如何在mac中合並lib靜態庫. 這裏以移動廣告 ...

  3. Qt下使用的靜態鏈接庫------ *.lib轉化為mingw使用的.a格式的靜態庫

    使用MinGW附帶的工具reimp.exe,該工具一般在MinGW in目錄下,其readme文檔在MinGWdoc eimp目錄下, 方法很簡單,比如: C:CodeBlocksMinGWlibdx ...

  4. Debug不崩潰Release版本崩潰的一種原因

    今天有一個工程Debug是正常,Release崩潰,鬱悶至極. 研究了一下下午,原因是一個類成員變量沒有構造函數中初始化.而Debug版本正好沒有問題. 所以定義類成員,一定不能忘記初始化!!

  5. 動態庫dll使用module.def文件導出函數(像靜態庫一樣使用)

    1.新建文件module.def. 2.動態庫工程上右鍵->屬性->鏈接器->輸入->模塊定義文件編輯它寫入module.def 3.下面為module.def實例(smart ...

  6. c/c++:動態庫 靜態庫 linux/windows 例子 (轉)

    作者:吳秦出處:http://www.cnblogs.com/skynet/本文基於署名 2.5 中國大陸許可協議發布,歡迎轉載,演繹或用於商業目的,但是必須保留本文的署名吳秦(包含鏈接). C++靜 ...

  7. windows中靜態庫lib和動態dll的區別及使用方法

    1. 靜態庫lib和動態dll的區別 1.1 項目類型 VS在建Win32項目時,有以下選項: windows應用程序控制臺應用程序DLL靜態庫最後兩個類型:DLL和靜態庫,這兩種項目類型是不可以單獨 ...

  8. 【C/C++開發】C++靜態庫與動態庫以及在Linux和Windows上的創建使用

    原文出處: 吳秦的博客    這次分享的宗旨是--讓大家學會創建與使用靜態庫.動態庫,知道靜態庫與動態庫的區別,知道使用的時候如何選擇.這裏不深入介紹靜態庫.動態庫的底層格式,內存布局等,有興趣的同學 ...

  9. Windows靜態庫和動態庫的創建和使用

    偶們在實際的編程開發中,經常會遇到運行時無法找到某個DLL文件或者鏈接時無法找到某個LIB文件.然後,我們就開始亂GOOGLE一下,然後將VS2005的設置改變一下,或許就Ok了,我們將別人開發的DL ...

  10. Windows靜態庫和動態庫的創建和使用(VS2005)

    偶們在實際的編程開發中,經常會遇到運行時無法找到某個DLL文件或者鏈接時無法找到某個LIB文件.然後,我們就開始亂GOOGLE一下,然後將VS2005的設置改變一下,或許就Ok了,我們將別人開發的DL ...

隨機推薦

  1. gdb調試工具vi編譯器命令參考網址

    vi編譯器命令:參考http://www.cnblogs.com/junw_china/articles/1708967.html gbd調試命令:參考http://blog.chinaunix.ne ...

  2. .NET平臺機器學習組件-Infer.NET(三) Learner API—數據映射與序列化

             所有文章分類的總目錄:http://www.cnblogs.com/asxinyu/p/4288836.html 微軟Infer.NET機器學習組件:http://www.cnblo ...

  3. Android學習三:線程操作

    作為Android開發的組成部分,多線程的作用舉足輕重,先來說說應用場景 1多線程使用場景 1.1正常使用中,經常有子線程來更新界面UI的需求,但是安卓不允許子線程更新UI 使用子線程處理UI,若線程 ...

  4. JavaBean與Jsp

    這一節我們總結一下JavaBean和Jsp的關系. 1. JavaBean javaBean是一個遵循特定寫法的Java類,它通常具有如下特點:        1)這個java類必須具有一個無參構造函 ...

  5. 160829、Java加解密與數字簽名

    ** Java加解密 ** 實現方式:JDK實現,CC,BC JDK提供比較基礎的底層的實現:CC提供一些簡化的操作:BC提供補充 一.Base64加密 非常簡單,加密解密就一個函數. 代碼如下: 二 ...

  6. 前端制作中,IE6還有必要兼容嗎?

    國內市場對IE 6~7支持還有一定需求,但對於一個前端開發者,我們應該去推動這個行業向前發展,而不是一味遷就.妥協. 曾經,能够提供支持老版本 IE 是一個前端開發者的必備技能.隨著移動互聯網大潮來臨 ...

  7. mysql中使用show table status 查看錶信息

    本文導讀:在使用mysql數據庫時,經常需要對mysql進行維護,查詢每個庫.每個錶的具體使用情况,Mysql數據庫可以通過執行SHOW TABLE STATUS命令來獲取每個數據錶的信息. 一.使用 ...

  8. js通過class獲取元素時的兼容性解决方案

    1:::::方法代碼如下:function getByClass(sClass){    var aResult=[];    var aEle=document.getElementsByTagNa ...

  9. easyui datagrid屬性和方法

    本文可以當做api來使用 使用方法(Usage Example) 從現有的錶單元素創建數據錶格,定義在html中的行,列和數據. <table class="easyui-datagr ...

  10. EF(EntityFramework)與mysql使用,序列化問題[System.ObjectDisposedException]

    在EF 中使用mysql關聯取數據時,如果當前實體中包含另一個實體的list成員,而這個成員為空的話,在json序列化的時候就會報錯: '((System.Data.Entity.DynamicPro ...