Redis原始碼分析 記憶體管理

2021-09-30 10:01:41 字數 2146 閱讀 3930

原始碼版本:

redis 2.4.4

redis記憶體相關函式都放在zmalloc.h zmalloc.c中

redis中可以使用tcmalloc、jemalloc

makefile:

ifeq ($(use_tcmalloc),yes)

alloc_dep=

alloc_link=-ltcmalloc

alloc_flags=-duse_tcmalloc

endif

ifeq ($(use_jemalloc),yes)

alloc_dep=../deps/jemalloc/lib/libjemalloc.a

alloc_link=$(alloc_dep) -ldl

alloc_flags=-duse_jemalloc -i../deps/jemalloc/include

endif

zmalloc.c中

#if defined(use_tcmalloc)

#define malloc(size) tc_malloc(size)

#define calloc(count,size) tc_calloc(count,size)

#define realloc(ptr,size) tc_realloc(ptr,size)

#define free(ptr) tc_free(ptr)

#elif defined(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

簡單封裝

void *zmalloc(size_t size);

void *zcalloc(size_t size);

void *zrealloc(void *ptr, size_t size);

void zfree(void *ptr);

分別對malloc、calloc、realloc、free做了簡單封裝

對zmalloc和zfree做分析

void *zmalloc(size_t size) 

void zfree(void *ptr)

除了分配給指定大小的記憶體之外,還分配

了prefix_size

記憶體格局如下:

申請記憶體返回real_ptr

#define update_zmalloc_stat_alloc(__n,__size) do  else  \

} while(0)

#define update_zmalloc_stat_free(__n) do else \

} while(0)

used_memory記錄當前分配的總記憶體

在定義了 int vm_max_threads; /* max number of i/o threads running at the same time */

if (server.vm_max_threads != 0)

zmalloc_enable_thread_safeness(); /* we need thread safe zmalloc() */

在使用threaded virtual memory i/o的時候,需要安全的zmalloc

size_t zmalloc_used_memory(void)
zmalloc_used_memory返回程序當前使用的記憶體,用以做相應的清記憶體操作,eg:

zmalloc_used_memory() > server.maxmemory //和配置的最大記憶體比較

....

zmalloc_get_rss()用來計算

程序實際使用物理記憶體

PHP原始碼分析(記憶體管理)

void ptr emalloc size efree ptr 釋放記憶體的時候只傳入ptr,並沒有傳入釋放記憶體大小 當我們申請乙個size大小的記憶體的時候,我們多申請一些存起來,下次使用者申請的時候,直接給出相應大小的記憶體即可,這樣減少了使用者態和核心態的切換,提高效率,記憶體 的時候需要知...

FreeRTOS記憶體管理原始碼分析

記憶體管理一直都是重中之重的知識。記憶體管理在freertos系統中是可裁剪可配置的。freertos提供了5種記憶體管理方案。暫時可能分析不完5種方案,今天能寫多少先寫多少,後續有時間了再一點一點的寫吧。5中方案對比如下 方案1 記憶體一旦分配出去就無法 了。記憶體釋放函式是乙個空函式,什麼都沒做...

Libevent 2 1 8原始碼分析 記憶體管理

預設情況下,libevent使用c庫的記憶體管理函式在堆上分配記憶體 其實也就是我們在c中經常使用的malloc realloc和free 當然如果對於記憶體的管理有極高的要求,例如在我們的應用程式中可能頻繁的申請和釋放libevent相關的物件,如果採用預設的記憶體管理,那麼可能就會產生大量的記憶...