redis 内存管理分析
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 内存管理分析相关推荐
- dpdk内存管理分析
dpdk内存管理分析 文章目录 dpdk内存管理分析 1.1 简述 1.2 `rte_config_init`分析 1.3 `eal_hugepage_info_init`的分析 1.4 `rte_e ...
- FreeRTOS高级篇7---FreeRTOS内存管理分析
内存管理对应用程序和操作系统来说都非常重要.现在很多的程序漏洞和运行崩溃都和内存分配使用错误有关. FreeRTOS操作系统将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理 ...
- python 内存分析_python内存管理分析
本文较为详细的分析了python内存管理机制.分享给大家供大家参考.具体分析如下: 内存管理,对于Python这样的动态语言,是至关重要的一部分,它在很大程度上甚至决定了Python的执行效率,因为在 ...
- ntfs分配单元大小_万字长文图解 Go 内存管理分析:工具、分配和回收原理
" golang的内存分析工具怎么用?内存和回收原理,这一篇就够了" 大纲 1. 目录 2. 由一个问题展开 3. 名字说明 4. 内存怎么采样? 4.1 编译期间逃逸分析 4.2 ...
- redis lua 设置过期_详解 Redis 内存管理机制和实现
Redis是一个基于内存的键值数据库,其内存管理是非常重要的.本文内存管理的内容包括:过期键的懒性删除和过期删除以及内存溢出控制策略. 最大内存限制 Redis使用 maxmemory 参数限制最大可 ...
- memcached 内存管理 分析(转)
Memcached是一个高效的分布式内存cache,了解memcached的内存管理机制,便于我们理解memcached,让我们可以针对我们数据特点进行调优,让其更好的为我所用.这里简单谈一下我对me ...
- Android之ION内存管理分析
备注:图片中的双向箭头表示他们是链表,前后链接起来的,单向箭头表示指针指向谁. 感兴趣可以加QQ群85486140,大家一起交流相互学习下! 做Camera都快2年了,对buffer流转,bu ...
- linux内存管理分析 二,linux内存管理分析【二】
为建立内存管理系统,在内核初始化过程中调用了下面几个函数: init/main.c asmlinkage void __init start_kernel(void) { ...... 初始化持久映射 ...
- java内存管理课程设计_Java内存管理分析
Java内存主要分为stack, heap, data segment, and code segment. stack(栈):存放非静态基本数据类型变量的名称和值,以及非静态对象的引用 若是非静态基 ...
最新文章
- 面向小白的最全 Python 可视化教程,超全的!
- ptrace原理与性能对比
- npm run dev 出现npm ERR!missing scrip:dev
- SD--RV_accounting_document_create函数的代码解读
- sigmstar SSD201/SSD202 openwrt--应用支持分享
- WSPBuilder 生成Webpart 部署包
- mac vulkan_基于 mac 的 ncnn vulkan iOS集成参考
- 唐诗三百首加密软件如何使用_绿盾加密软件如何设置审批流程管理
- adb命令 关机与重启
- Oracle 数据库基本知识概念
- hybird简介以及安卓应用hybird初体验
- wordpress插件-wordpress常用插件大全
- java代码在图片上画框
- Qt-Arm交叉编译以及调用虚拟键盘(中英)
- 【每日新闻】华米科技收购Zepp与PEI核心资产;西藏宁算科技与阿里云签署框架合作协议...
- HDU 2022 海选女主角
- 自己动手,编写神经网络程序,解决Mnist问题,并网络化部署-6CBIR模拟问题
- 2022开源PHP留言反馈管理系统 v2.0
- 如何让两台笔记本电脑通过无线网卡连接起来
- 信号--Signal
热门文章
- java下载文件名乱码的解决方法
- 如何恢复初始git提交?
- win11如何创建访客账户 windows11创建访客账户的设置方法
- win11任务栏怎么设置大小
- 能不能翻译PHP网站源码,有朋友可以帮忙用PHP翻译一段PYTHON代码吗?
- centos5安装mysql 5.6.19 mysql-devel_Centos5.8 安装 MySQL5.6.19
- 事件对象使用方法大全(源码解析)
- php挂qq,PHP在线挂QQ个人隐私泄漏
- win7优化设置_Win10系统优化软件,这是我用的最舒服的一款软件了!
- Confluence 6 针对合并完全失败的内容重新运行合并