原始碼版本:
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相關的物件,如果採用預設的記憶體管理,那麼可能就會產生大量的記憶...