jemalloc替换标准库 malloc等函数的三种方式

用LD_PRELOAD加载jemalloc 在使用CentOS 7.6,用LD_PRELOAD方法测试了一下jemalloc 和 glibc自带的malloc的性能,发现的确更好。 为何没有测试 tcmalloc?因为从网上查了一下,tcmalloc 和 jemalloc的对比 (原文) : 作为基础库的ptmalloc是最为稳定的内存管理器,无论在什么环境下都能适应,但是分配效率相对较低。 tcmalloc针对多核情况有所优化,性能有所提高,但是内存占用稍高,大内存分配容易出现CPU飙升。 jemalloc的内存占用更高,但是在多核多线程下的表 阅读详情
AI摘要

博客介绍了C++使用jemalloc的三种方式。一是用LD_PRELOAD,可无侵入式替换,运行程序前设置即可;二是在代码中调用je_malloc,此为侵入式,无jemalloc库程序无法启动,编译需设置;三是使用hook方式,也是侵入式且有一定不安全性。

1、LD_PRELOAD

使用LD_PRELOAD可以做到无侵入式替换,只需要在运行程序前设置env ,export LD_PRELOAD=/path/to/jemalloc
注:编译jemalloc时不设置--with-jemalloc-prefix

#include <cstdlib>
#include <stdio.h>
#include <string.h>
#include <iostream>

// 当使用 export LD_PRELOAD= 预加载jemalloc库时
// malloc 将会被 jemalloc的符号替换, 做到无需修改源代码即可使用jemalloc

/**
 * @brief 原理
 * 
 * 加载顺序
 * 1、可执行程序
 * 2、LD_PRELOAD 库
 * 3、其他库,根据其在链接时的顺序
 * 
 * 当多个库中有相同符号时, 动态链接器会选择第一个加载的符号. 故使用 LD_PRELOAD 可以替换标准库的 malloc
 */

int main(int argc, char **argv)
{
    size_t size = 1024;
    void* ptr = malloc(size);
    if (!ptr) {
        std::cerr << "Memory allocation failed" << std::endl;
        return 1;
    }

    memset(ptr, 0, size);

    free(ptr);
    return 0;
}

2、代码中调用je_malloc

这种做法是侵入式的,如果没有jemalloc库将无法启动程序,另外编译代码时需要设置 --with-jemalloc-prefix=je_

#include <cstdlib>
#include <stdio.h>
#include <string.h>
#include <iostream>

#include <jemalloc/jemalloc.h>

// 主动链接jemalloc时需要在编译时带上 --with-jemalloc-prefix=je_
// 不带时编译出来的符号就是 malloc, 防止冲突, 带上后符号是 je_malloc

int main()
{
    size_t size = 1024;
    void* ptr = je_malloc(size);
    if (!ptr) {
        std::cerr << "Memory allocation failed" << std::endl;
        return 1;
    }

    memset(ptr, 0, size);

    ::atexit([](){
        uint64_t epoch = 1;
        size_t sz = sizeof(epoch);
        je_mallctl("epoch", &epoch, &sz, &epoch, sz);

        size_t allocated, active, mapped;
        sz = sizeof(size_t);
        je_mallctl("stats.allocated", &allocated, &sz, NULL, 0);
        je_mallctl("stats.active", &active, &sz, NULL, 0);
        je_mallctl("stats.mapped", &mapped, &sz, NULL, 0);

        printf("allocated/active/mapped: %zu/%zu/%zu\n", allocated, active, mapped);
    });

    // 释放内存
    je_free(ptr);
    return 0;
}
3、使用hook方式

侵入式的,并且存在一定的不安全性

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <string>

#include <signal.h>

#include <unistd.h>
#include <dlfcn.h>

#include <jemalloc/jemalloc.h>

// 这种情况需要将 malloc/calloc 等全都 hook, 假设没有 hook realloc, 第三方库使用此函数申请的内存使用free会出现段错误
// c++ 重载 operator new/operator delete 一般是成对的, 默认的 new/delete 底层使用 malloc 无需考虑

struct ReplaceMallocFree
{
    using SelfMalloc = void *(*)(size_t);
    using SelfFree = void (*)(void *);

    ReplaceMallocFree()
    {
        m_malloc = (SelfMalloc)dlsym(RTLD_NEXT, "malloc");
        m_free = (SelfFree)dlsym(RTLD_NEXT, "free");

        assert(m_malloc && m_free);

        printf("malloc = %p, free = %p\n", m_malloc, m_free);
    }

    SelfMalloc  m_malloc;
    SelfFree    m_free;
};

ReplaceMallocFree g_replaceMallocFree;

#ifdef __cplusplus
extern "C" {
#endif

void* malloc(size_t size)
{
    // printf 有调用malloc行为, 会导致无限递归出现段错误
    write(STDOUT_FILENO, "---> malloc\n", 12);
    return je_malloc(size);
}

void free(void *ptr)
{
    write(STDOUT_FILENO, "---> free\n", 12);
    je_free(ptr);
}

#ifdef __cplusplus
}
#endif


void catch_sig(int32_t sig)
{
    if (sig == SIGABRT) {
        printf("\nSUCCESS\n");
    }

    exit(0);
}

int main()
{
    // 标准库的 free 检测到异常会调用 abort
    signal(SIGABRT, catch_sig);

    size_t size = 1024;
    void* ptr = malloc(size);
    if (!ptr) {
        printf("Memory allocation failed\n");
        return 1;
    }

    memset(ptr, 0, size);

    uint32_t *pp = new uint32_t;
    free(pp);

    printf("-------------\n");

    g_replaceMallocFree.m_free(ptr);
    return 0;
}
Linux内存管理(四):Jemalloc 1. Jemalloc简介 jemalloc 是由 Jason Evans 在 FreeBSD 项目中引入的新一代内存分配器。它是一个通用的 malloc 实现,侧重于减少内存碎片和提升高并发场景下内存的分配效率,其目标是能够替代 malloc。jemalloc 应用十分广泛,在 Firefox、Redis、Rust、Netty 等出名的产品或者编程语言中都有大量使用。具体细节可以参考 Jason Evans 发表的论文 《A Scalable Concurrent malloc Implemen... 阅读详情

相关推荐

C语言标准库6大模块实战:从ctype到string的10个高频函数性能对比

本文深入对比C语言标准库中ctype、time、stdio、stdlib、math和string六大模块的10个高频函数性能,通过实测数据揭示不同场景下的最优选择策略。结果显示查表法实现的函数如isalpha()比算术运算实现快15%,而math.h中的复杂函数如log()没有高效替代方案。文章还提供了跨模块性能优化策略和场景化函数选型指南,帮助开发者提升程序效率。

weixin_30645617的博客 329

替代系统malloc/new--选择合适的内存跟踪方案

替代系统自带的malloc/new原因无非两个:  reason 1. 做内存profile或查找问题    reason 2. 自定义的分配方案提高性能   不过文章[1]中说明了,替代全局new不是一个好做法. 其实要达到以上两点目的,笔者认为用valgrind工具链就可以了。   解决方案: 1. 用valgrind和massif      valgrind的memcheck...

2121

C/C++内存管理实战:从malloc到ARM汇编的完整认知框架

内存管理是C/C++编程的核心基础,其本质是对计算机内存资源的有效组织与调度。从原理上看,它涉及内存空间的分配、回收与保护机制,直接关系到程序的稳定性与性能。在技术价值层面,深入理解内存管理能帮助开发者避免内存泄漏、越界访问等隐蔽错误,并显著提升程序在资源受限环境下的运行效率。应用场景广泛,从服务器后端开发到嵌入式系统,再到高性能计算,都离不开对内存的精细控制。本文以cJSON库的内存陷阱和ARM Compiler 5环境下的底层内存模型为例,探讨如何构建从高层语言API到底层硬件协同的立体认知模型,从而系

weixin_33889245的博客 532

jemalloc java_C++性能优化(十) —— JeMalloc

C++性能优化(十) —— JeMalloc一、JeMalloc简介1、JeMalloc简介JeMalloc 是一款内存分配器,最大的优点在于多线程情况下的高性能以及内存碎片的减少。GitHub地址:https://github.com/jemalloc/jemalloc2、JeMalloc安装JeMalloc源码下载:git clone https://github.com/jemalloc/j...

weixin_36179777的博客 747

【嵌入式】如何替换malloc

使用LD_PRELOAD字段的预加载方式xsmemcheck.so 参考实现代码如下。

Bigan(安)的博客 526

FDTD材料nk值拟合优化指南:利用材料资源管理器提升光学模型精度

本文详细介绍了如何利用FDTD仿真软件中的材料资源管理器,对材料nk值进行精确拟合与优化,从而提升光学模型的仿真精度。文章通过实战案例,解析了拟合参数调整、报告解读以及针对varFDTD求解器的特殊注意事项,帮助用户从根本上解决仿真结果不准的常见问题。

weixin_29196891的博客 352

jemalloc 完整介绍与实战使用

摘要: jemalloc是一款高性能通用内存分配器,主打低碎片、高并发和可观测性,广泛应用于Redis、MySQL等长期运行服务。相比ptmalloc,其通过三级缓存结构(TCache线程缓存、Arena多分配区、Chunk大块内存)实现无锁分配和异步回收,碎片率低于10%。支持动态/静态链接及LD_PRELOAD快速接入,通过MALLOC_CONF环境变量调优(如启用后台线程、透明巨页等)。内置jeprof工具可分析内存泄漏,生产环境推荐配置异步回收和CPU亲和。与tcmalloc相比,jemalloc更

bkspiderx的博客 498

PSI5协议技术文档与驱动开发指南

• 供电与数据复用:ECU通过双绞线为传感器提供稳压(典型值5V-11V),同时检测线路电流变化实现数据传输。• 同步信号:ECU发送3.5V电压脉冲(上升沿触发传感器响应),用于时序同步。• 安全气囊:PSI5-P模式实现多碰撞传感器同步采样(响应时间<10ms)• CRC-3(3位):ASIL-B以上功能安全要求(如动力总成传感器)• 奇偶校验(1位):适用于低安全等级场景(如PSI5-P10P模式)• 典型应用:PSI5-P(并行总线)、PSI5-U(通用总线)

u012733413的博客 2867

KV-Engine:内存管理的艺术与 Jemalloc 的集成

和。

Nexus_Y的博客 285

TM1621/HT1621 段码LCD驱动器

TM1621 LCD 驱动器

qq_45325304的博客 1万+

VB.net:VB.net编程语言学习之基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的案例应用(启动SolidWorks代码/直接驱动模型代码/路径下模型驱动代码/创建两个文

VB.net:VB.net编程语言学习之基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的案例应用(启动SolidWorks代码/直接驱动模型代码/路径下模型驱动代码/创建两个文件夹对话框代码/重新生成三维图代码/导出工程图代码)之详细攻略 目录 基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的案例应用 1、调用SW的模型,并进行参数修改 1.1、VB按钮之SW的三维零件之间切换思想 1.2、调用SW 2、基础案例经验 2.1、设计SW的拉

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 3035

C++内存管理底层探秘:从malloc原理到内存池优化实战

内存管理是计算机科学的核心基础概念,它负责程序运行时内存资源的分配与回收。其原理涉及操作系统虚拟内存机制、分配器算法(如空闲链表、伙伴系统)以及硬件MMU的协同工作。理解内存管理机制的技术价值在于能够编写出高性能、低延迟且稳定的系统软件,尤其在游戏开发、高频交易、嵌入式系统等对资源极度敏感的应用场景中至关重要。本文以C++为背景,深入剖析Glibc的ptmalloc等通用内存分配器的底层实现,并探讨如何通过定制内存池和选择高效分配器(如tcmalloc、jemalloc)来解决内存碎片和多线程性能瓶颈等实际

chuchen7021的博客 388

RK3588 部署 YOLO26 目标检测:从训练到 NPU 推理

如果做垂直场景(工业缺陷、农作物、特定零件),需要自己标数据。采集图像(500+ 张,覆盖不同光照/角度)→ 筛选(删除模糊/无目标)→ LabelImg 标注(选择 YOLO 格式)→ 划分(train:val:test = 7:2:1)labelImg├── train/├── val/├── test/YOLO26 在 RK3588 上的全流程是 PC 端训练 + ONNX 导出 → RKNN 转换(INT8 量化)→ 板端推理。

m0_71589036的博客 109

告别内存碎片:jemalloc_cpp如何优化C++内存分配

你是否遇到过C++程序运行卡顿、内存占用飙升的问题?当标准`new/delete`无法满足高性能需求时,jemalloc作为一款专业的内存分配器(Memory Allocator)已成为众多大型应用的首选。而jemalloc_cpp模块更是为C++开发者提供了量身定制的优化方案,本文将从实际应用角度,带你掌握如何利用jemalloc_cpp解决内存碎片、提升并发性能的核心技巧。 ## 为什么需要...

gitblog_00959的博客 564

国科大学习资料--矩阵论(叶世伟)-期末考试题整理3

国科大学习资料–矩阵论-期末考试题整理3 国科大学习资料–矩阵论-期末考试题整理3 国科大学习资料–矩阵论-期末考试题整理3

无名何许人的博客 1402

安川机器人外部轴添加

本文详细介绍了如何在安川机器人本体上添加第7轴以及如何设置动作,本文以添加点焊枪为例进行讲解。

haier123888的博客 7889

逐字段读懂nemotron-labs-unified-asr-0.6b-4bit的config.json:编码器、128语言prompt字典与量化参数全解

nemotron-labs-unified-asr-0.6b-4bit 是 NVIDIA Nemotron 0.6B 统一多语言**语音识别(ASR)**模型经 MLX 格式的 **4-bit 量化**版本,支持 25 种欧洲语言的离线转写与实时流式转写,并自动添加标点与大小写。仓库里的 [config.json](https://link.gitcode.com/i/acce6d04928b14

gitblog_00134的博客 223

【ARXML专题】-2-创建一个Classic CAN(经典CAN2.0)/CANFD的系统描述ARXML文件

目录 1 创建一个AUTOSAR系统描述 2 物理层命名以及创建ECU 3 新建一个Frame 4 新建一个PDU 5 新建一个signal 6 结尾 AUTOSAR System Description Network Explorer是一个文件编辑器,支持可视化和编辑系统描述的AUTOSAR系统描述文件和ECU摘录的通信内容,它支持架构版本4.0.3、4.1.2、4.2.1、4.2.2和4.3.0。AUTOSAR系统描述(ARXML)文件是基于XML的文件格式,描述网络通信的元素...

「汽车电子助手」的博客 1万+

深入解析Linux内存管理:malloc原理与性能优化

内存管理是Linux系统编程的核心技术之一,其中malloc作为C语言标准库的动态内存分配函数,其实现机制直接影响程序性能。通过分析内存分配器的设计原理,可以理解其如何平衡分配速度、内存利用率和碎片控制等关键指标。现代malloc实现通常采用分级管理策略,如glibc中的fast bins、small bins和large bins,针对不同大小的内存请求进行优化。在多线程环境下,通过arena架构和线程本地存储减少锁竞争。掌握这些底层机制对于开发高性能服务至关重要,特别是在Web服务器、数据库等需要频繁内

weixin_30591551的博客 407

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Disque deps 依赖目录深度解析:jemalloc、hiredis、linenoise 等第三方组件的用途与升级实践

本篇以 Disque 仓库 [deps/README.md](https://link.gitcode.com/i/cb1620a8a21e5af3c26d051b2ad42452) 为骨架,系统梳理 `deps` 目录中第三方依赖的职责分工、与 Disque 主程序(`src/` 下的 `disque-server` 与 `disque` 命令行工具)的实际耦合关系,以及各依赖的标准升级流程与注

gitblog_00182的博客 155

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

在 Alpine/musl 上运行 Netty 原生 QUIC:jemalloc 预加载与 glibc 兼容性实战指南

本文围绕 Netty 仓库中 `codec-native-quic` 模块(`netty-codec-native-quic`)在 Alpine Linux(musl libc)上的运行问题进行系统讲解。它回答两个关键实战问题:为什么在 musl 上必须为 QUIC 预加载 jemalloc 才能获得与 glibc 相当的吞吐,以及 glibc 构建的原生库是如何被改造成能在 musl 下正常加载

gitblog_00778的博客 426

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

TCMalloc与JeMalloc实战指南:高并发内存分配优化

内存分配器是现代服务性能的关键底层组件,其核心作用在于解决高并发场景下的锁竞争、内存碎片、缓存局部性与元数据开销问题,而非单纯增加物理内存。TCMalloc通过线程本地缓存(thread cache)消除分配路径锁争用,JeMalloc则依托arena分片与精细化bin管理实现更优的长期稳定性与调试能力。二者的技术价值体现在QPS提升、P99延迟下降及RSS峰值降低等可量化指标上,广泛应用于API网关、实时音视频、数据库连接池等低延迟、长生命周期服务。本文聚焦生产环境中的替换验证、配置调优与故障归因,覆盖L

weixin_30431445的博客 300

C语言动态内存分配与malloc/free使用详解

动态内存分配是C语言编程中的核心概念,它允许程序在运行时根据需要从堆区申请内存空间。通过malloc、calloc等函数实现按需分配,配合free函数手动释放,这种机制突破了静态数组的固定大小限制,使程序能够灵活处理未知规模的数据。在操作系统层面,内存管理涉及虚拟内存映射和页表控制等底层原理。正确使用动态内存可以提升内存利用率,但需要警惕内存泄漏和悬垂指针等问题。实际开发中,Valgrind等工具能有效检测内存错误,而封装分配函数、实现内存池等技术可提升工程可靠性。本文以学生管理系统等典型场景为例,深入解析

weixin_33782386的博客 703

C语言动态内存管理:malloc、calloc、realloc与free实战解析

动态内存管理是C语言编程的核心技术之一,它允许程序在运行时根据需求灵活分配和释放内存。其原理基于程序内存布局中的堆区,程序员通过调用标准库函数手动管理这片区域,从而突破静态内存分配在编译时确定大小的限制。这项技术的核心价值在于能够高效处理未知规模的数据、构建复杂动态数据结构(如链表、树),并有效避免栈溢出风险。在实际应用场景中,动态内存管理是开发高性能服务器、操作系统内核、游戏引擎及嵌入式系统等底层软件的基础。本文将深入解析malloc、calloc、realloc和free这一核心函数组合,并结合内存泄漏

weixin_30480075的博客 379

C/C++内存管理深度解析:从基础原理到自定义内存池实战

内存管理是程序运行的基石,它决定了数据在计算机内存中的组织、分配与回收方式。其核心原理在于高效利用有限的内存资源,避免泄漏与碎片,从而保障程序的稳定与性能。在C/C++这类系统级编程语言中,开发者拥有直接操控内存的能力,这既是优势也带来了挑战。标准库提供的`malloc/free`和`new/delete`是基础工具,但在高并发、高性能或资源受限的应用场景下,它们可能成为性能瓶颈。为此,业界发展出了如tcmalloc、jemalloc等优化分配器,以及更为极致的解决方案——自定义内存池。内存池通过预先分配大

weixin_34221073的博客 376

C++ STL空间配置器:内存管理核心原理与性能优化实战

内存管理是编程中的基础概念,它涉及程序运行时对内存资源的分配、使用和回收。其核心原理在于高效利用有限的内存空间,减少碎片化,并提升访问速度。在C++中,标准模板库(STL)通过空间配置器(Allocator)这一关键技术组件,将内存分配与对象构造分离,实现了泛型容器的高效内存管理。这一设计具有重要的技术价值,它允许开发者针对特定场景(如高频交易、游戏服务器或嵌入式系统)定制内存策略,从而优化性能、减少系统调用开销并控制内存碎片。应用场景广泛,从通用服务到对实时性、内存占用敏感的专用领域。本文聚焦于**SGI

weixin_34393428的博客 392
上一篇: TCP simultaneous open测试
下一篇: IPhone 端口使用
山有木兮啊
博客等级 码龄8年 135粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值