2019独角兽企业重金招聘Python工程师标准>>>

redis 可以选择行的使用 jemalloc 和tcmalloc 等

但是linux 下默认使用 jemalloc ,而且redis 的目录中也自带了jemalloc的库

在makefile 中可以看到:

ifeq ($(uname_S),Linux)27   MALLOC=jemalloc28 else29   MALLOC=libc30 endif

需要引入 jemalloc 的静态库:

makefile中可以看见:

feq ($(MALLOC),jemalloc)74   DEPENDENCY_TARGETS+= jemalloc75   FINAL_CFLAGS+= -DUSE_JEMALLOC -I../deps/jemalloc/include76   FINAL_LIBS+= ../deps/jemalloc/lib/libjemalloc.a -ldl77 endif

vim zmalloc.h

代码如下:

#if defined(USE_TCMALLOC)39 #define ZMALLOC_LIB ("tcmalloc-" __xstr(TC_VERSION_MAJOR) "." __xstr(TC_VERSION_MINOR))40 #include <google/tcmalloc.h>41 #if (TC_VERSION_MAJOR == 1 && TC_VERSION_MINOR >= 6) || (TC_VERSION_MAJOR > 1)42 #define HAVE_MALLOC_SIZE 143 #define zmalloc_size(p) tc_malloc_size(p)44 #else45 #error "Newer version of tcmalloc required"46 #endif47 48 #elif defined(USE_JEMALLOC)49 #define ZMALLOC_LIB ("jemalloc-" __xstr(JEMALLOC_VERSION_MAJOR) "." __xstr(JEMALLOC_VERSION_MINOR) "    ." __xstr(JEMALLOC_VERSION_BUGFIX))50 #include <jemalloc/jemalloc.h>51 #if (JEMALLOC_VERSION_MAJOR == 2 && JEMALLOC_VERSION_MINOR >= 1) || (JEMALLOC_VERSION_MAJOR > 2)52 #define HAVE_MALLOC_SIZE 153 #define zmalloc_size(p) je_malloc_usable_size(p)54 #else55 #error "Newer version of jemalloc required"56 #endif57 58 #elif defined(__APPLE__)59 #include <malloc/malloc.h>60 #define HAVE_MALLOC_SIZE 161 #define zmalloc_size(p) malloc_size(p)62 #endif63 64 #ifndef ZMALLOC_LIB65 #define ZMALLOC_LIB "libc"66 #endif

查看zmalloc

使用  HAVE_MALLOC_SIZE 判断内存分配的方式:

HAVE_MALLOC_SIZE  依赖:JEMALLOC_VERSION_MAJOR

代码如下:

zmalloc.h

#if (JEMALLOC_VERSION_MAJOR == 2 && JEMALLOC_VERSION_MINOR >= 1) || (JEMALLOC_VERSION_MAJOR > 2)52 #define HAVE_MALLOC_SIZE 1
JEMALLOC_VERSION_MAJOR  定义在jemalloc.h 中。
代码如下: 所以 HAVE_MALLOC_SIZE 的值是1
所以内存分配的方式就直接明了
#define JEMALLOC_VERSION "3.2.0-0-g87499f6748ebe4817571e817e9f680ccb5bf54a9"11 #define JEMALLOC_VERSION_MAJOR 312 #define JEMALLOC_VERSION_MINOR 213 #define JEMALLOC_VERSION_BUGFIX 014 #define JEMALLOC_VERSION_NREV 015 #define JEMALLOC_VERSION_GID "87499f6748ebe4817571e817e9f680ccb5bf54a9"

zmalloc.c

oid *zmalloc(size_t size) {
122     void *ptr = malloc(size+PREFIX_SIZE);
123
124     if (!ptr) zmalloc_oom_handler(size);
125 #ifdef HAVE_MALLOC_SIZE
//运行的是这个126     update_zmalloc_stat_alloc(zmalloc_size(ptr));
127     return ptr;
128 #else
129     *((size_t*)ptr) = size;
130     update_zmalloc_stat_alloc(size+PREFIX_SIZE);
131     return (char*)ptr+PREFIX_SIZE;
132 #endif
133 }

转载于:https://my.oschina.net/u/1388024/blog/221065

redis 内存管理分析相关推荐

  1. dpdk内存管理分析

    dpdk内存管理分析 文章目录 dpdk内存管理分析 1.1 简述 1.2 `rte_config_init`分析 1.3 `eal_hugepage_info_init`的分析 1.4 `rte_e ...

  2. FreeRTOS高级篇7---FreeRTOS内存管理分析

    内存管理对应用程序和操作系统来说都非常重要.现在很多的程序漏洞和运行崩溃都和内存分配使用错误有关.         FreeRTOS操作系统将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理 ...

  3. python 内存分析_python内存管理分析

    本文较为详细的分析了python内存管理机制.分享给大家供大家参考.具体分析如下: 内存管理,对于Python这样的动态语言,是至关重要的一部分,它在很大程度上甚至决定了Python的执行效率,因为在 ...

  4. ntfs分配单元大小_万字长文图解 Go 内存管理分析:工具、分配和回收原理

    " golang的内存分析工具怎么用?内存和回收原理,这一篇就够了" 大纲 1. 目录 2. 由一个问题展开 3. 名字说明 4. 内存怎么采样? 4.1 编译期间逃逸分析 4.2 ...

  5. redis lua 设置过期_详解 Redis 内存管理机制和实现

    Redis是一个基于内存的键值数据库,其内存管理是非常重要的.本文内存管理的内容包括:过期键的懒性删除和过期删除以及内存溢出控制策略. 最大内存限制 Redis使用 maxmemory 参数限制最大可 ...

  6. memcached 内存管理 分析(转)

    Memcached是一个高效的分布式内存cache,了解memcached的内存管理机制,便于我们理解memcached,让我们可以针对我们数据特点进行调优,让其更好的为我所用.这里简单谈一下我对me ...

  7. Android之ION内存管理分析

    备注:图片中的双向箭头表示他们是链表,前后链接起来的,单向箭头表示指针指向谁.     感兴趣可以加QQ群85486140,大家一起交流相互学习下! 做Camera都快2年了,对buffer流转,bu ...

  8. linux内存管理分析 二,linux内存管理分析【二】

    为建立内存管理系统,在内核初始化过程中调用了下面几个函数: init/main.c asmlinkage void __init start_kernel(void) { ...... 初始化持久映射 ...

  9. java内存管理课程设计_Java内存管理分析

    Java内存主要分为stack, heap, data segment, and code segment. stack(栈):存放非静态基本数据类型变量的名称和值,以及非静态对象的引用 若是非静态基 ...

最新文章

  1. 面向小白的最全 Python 可视化教程,超全的!
  2. ptrace原理与性能对比
  3. npm run dev 出现npm ERR!missing scrip:dev
  4. SD--RV_accounting_document_create函数的代码解读
  5. sigmstar SSD201/SSD202 openwrt--应用支持分享
  6. WSPBuilder 生成Webpart 部署包
  7. mac vulkan_基于 mac 的 ncnn vulkan iOS集成参考
  8. 唐诗三百首加密软件如何使用_绿盾加密软件如何设置审批流程管理
  9. adb命令 关机与重启
  10. Oracle 数据库基本知识概念
  11. hybird简介以及安卓应用hybird初体验
  12. wordpress插件-wordpress常用插件大全
  13. java代码在图片上画框
  14. Qt-Arm交叉编译以及调用虚拟键盘(中英)
  15. 【每日新闻】华米科技收购Zepp与PEI核心资产;西藏宁算科技与阿里云签署框架合作协议...
  16. HDU 2022 海选女主角
  17. 自己动手,编写神经网络程序,解决Mnist问题,并网络化部署-6CBIR模拟问题
  18. 2022开源PHP留言反馈管理系统 v2.0
  19. 如何让两台笔记本电脑通过无线网卡连接起来
  20. 信号--Signal

热门文章

  1. java下载文件名乱码的解决方法
  2. 如何恢复初始git提交?
  3. win11如何创建访客账户 windows11创建访客账户的设置方法
  4. win11任务栏怎么设置大小
  5. 能不能翻译PHP网站源码,有朋友可以帮忙用PHP翻译一段PYTHON代码吗?
  6. centos5安装mysql 5.6.19 mysql-devel_Centos5.8 安装 MySQL5.6.19
  7. 事件对象使用方法大全(源码解析)
  8. php挂qq,PHP在线挂QQ个人隐私泄漏
  9. win7优化设置_Win10系统优化软件,这是我用的最舒服的一款软件了!
  10. Confluence 6 针对合并完全失败的内容重新运行合并