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

1、LD_PRELOAD

使用LD_PRELOAD可以做到无侵入式替换,只需要在运行程序前设置envexport 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_mallocint 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" {
#endifvoid* 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
}
#endifvoid catch_sig(int32_t sig)
{if (sig == SIGABRT) {printf("\nSUCCESS\n");}exit(0);
}int main()
{// 标准库的 free 检测到异常会调用 abortsignal(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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/57037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vite 创建了一个项目后,如何实现工程化

当我们使用 vite 创建了一个项目后&#xff0c;要开发自己的东西。首先要做的就是先将开发文件变成自己的样子。 这是一个刚刚创建项目的文件夹及展示 开始整改文件夹 修改文件 main.ts不需要修改App.vue删除无用的内容 <template><div>app组件</div> &l…

MedMobile:首款移动设备运行的医学级语言模型突破!

MedMobile&#xff1a;首款移动设备运行的医学级语言模型突破&#xff01; 近年来&#xff0c;语言模型&#xff08;LM&#xff09;在医学领域的表现令人瞩目&#xff0c;但高昂的计算成本和隐私问题阻碍了其广泛应用。为了应对这一挑战&#xff0c;一支研究团队开发了一款名为…

推荐一款好用的redis管理工具TinyRDM

简述 对于经常要操作redis的人员来说&#xff0c;一款好用开源的redis可视化管理工具可以事半功倍&#xff0c;今天要介绍的TinyRDM就是这样的工具&#xff0c;支持多端&#xff08;MAC/Window/Linux&#xff09;&#xff0c;并且是开源的。 github地址&#xff1a;https://git…

CSPM(项目管理专业人员评价)证书还不如PMP?垃圾证书……

一、什么是CSPM CSPM&#xff08;China Standards Project Management&#xff09;是指依据中国标准开展的项目管理专业人员能力评价。它是由中国标准化协会&#xff08;全国项目管理标准化技术委员会秘书处&#xff09;设立&#xff0c;运用已发布的项目管理国家标准&#xf…

平衡相图在资源可持续利用方向的应用

平衡相图是描述物质在特定温度、压力和组成条件下达到相平衡状态的图表。在环境科学中&#xff0c;平衡相图可以用于预测和解释自然环境中物质的分布、迁移和转化过程&#xff0c;对于资源的可持续利用和环境污染的防治具有重要意义。 平衡相图在资源的可持续利用方向的应用主…

软考:缓存分片和一致性哈希

缓存分片技术是一种将数据分散存储在多个节点上的方法&#xff0c;它在分布式缓存系统中尤为重要。这项技术的核心目的是提高系统的性能和可扩展性&#xff0c;同时确保数据的高可用性。以下是缓存分片技术的一些关键点&#xff1a; 数据分片&#xff1a;缓存分片涉及将数据分成…

100种算法【Python版】第17篇——Aho-Corasick算法

本文目录 1 算法原理2 算法步骤3 示例说明4 python代码5 应用领域6 优缺点分析6.1 优点6.2 缺点1 算法原理 Aho-Corasick算法是一种用于多模式字符串匹配的高效算法,能够在给定文本中同时查找多个模式字符串。该算法结合了字典树(Trie)和失败指针(Failure Links),实现了…

【YOLOv11[基础]】目标对象模糊处理

目录 一 安装YOLOv11 二 实践 使用Ultralytics YOLO11进行目标对象模糊处理,包括对图像或视频中特定检测到的对象应用模糊效果。这可以使用YOLO11模型功能来识别和操作给定场景中的对象。 目标对象模糊处理的优点: 隐私保护

Day16-非关系型数据库服务-redis

Day16-非关系型数据库服务-redis 1、非关系型数据库服务Redis1.1 Redis服务概述介绍1.1.1 缓存服务介绍1.1.2 缓存服务产品介绍1.1.3 缓存服务应用场景 1.2 Redis服务安装部署1.2.1 缓存服务安装部署 1.3 Redis服务基础管理操作1.3.1 缓存服务配置文件介绍1.3.2 缓存服务安全配…

如何对pdf文件进行加密?pdf文件加密全攻略与深度解析(5个方法)

如何对pdf文件进行加密&#xff1f; 只见&#xff0c;在深夜的情报局里&#xff0c;特工小李将一份绝密PDF文件放在保险箱内&#xff0c;以为这样就天衣无缝了。 细细推敲&#xff0c;漏洞百出&#xff1a; 如果钥匙被盗呢&#xff1f;如果被神匠破解出密码呢&#xff1f;如果…

AWTK fscript 中的 系统配置 扩展函数

fscript 是 AWTK 内置的脚本引擎&#xff0c;开发者可以在 UI XML 文件中直接嵌入 fscript 脚本&#xff0c;提高开发效率。本文介绍一下 fscript 中的 ** 系统配置 扩展函数 ** 获取 app_conf 对象后&#xff0c;可以直接用 object 的接口访问 app_conf。 1. app_conf 获取 …

解析MES管理系统在企业中的应用策略

在智能制造浪潮汹涌的今天&#xff0c;MES管理系统成为了连接生产现场与管理决策层的关键桥梁&#xff0c;其重要性在企业的智能化转型中愈发凸显。面对智能制造时代的新挑战&#xff0c;如何充分利用MES管理系统的优势&#xff0c;实现生产流程的智能、高效与透明&#xff0c;…

Pytest中autouse参数的用法

引言 在Pytest中&#xff0c;Fixture是一种非常有用的功能&#xff0c;它允许我们在测试前后进行一些设置和清理工作。通常&#xff0c;我们会在测试函数中显式地声明需要使用的Fixture。然而&#xff0c;有时候我们希望某些Fixture在所有测试中自动应用&#xff0c;而不需要在…

循序渐进丨openGauss / MogDB 数据库内存占用相关SQL

一、内存总体分布 数据库总体内存使用分布 select * from gs_total_memory_detail; 当dynamic_used_memory大于max_dynamic_memory就会报内存不足&#xff1b;如果此时dynamic_used_memory小于max_dynamic_memory&#xff0c;而dynamic_peak_memory大于max_dynamic_memory表…

DevSecOps在数字政府建设中的实践研究

摘要 随着信息技术的快速发展&#xff0c;数字政府建设已成为提升政府服务效率、增强公众参与度和保障信息安全的重要途径。DevSecOps作为一种将安全集成到软件开发和运维全生命周期的实践方法&#xff0c;对于数字政府建设具有重要的意义。本文旨在探讨DevSecOps在数字政府建设…

深入理解JAVA虚拟机(三)

JAVA对象内存结构分析 java对象主要由如下三部分构成&#xff1a;对象头&#xff08;Header&#xff09;、实例数据&#xff08;Instance Data&#xff09;和对齐填充&#xff08;Padding&#xff09;。其中对象头分为两部分&#xff1a;一部分存储运行时的数据&#xff08;Ma…

机房巡检机器人有哪些功能和作用

随着数据量的爆炸式增长和业务的不断拓展&#xff0c;数据中心面临诸多挑战。一方面&#xff0c;设备数量庞大且复杂&#xff0c;数据中心内服务器、存储设备、网络设备等遍布&#xff0c;这些设备需时刻保持良好运行状态&#xff0c;因为任何一个环节出现问题都可能带来严重后…

ReactOS系统中MM_REGION结构体的声明

ReactOS系统中MM_REGION结构体的声明 ReactOS系统中MM_REGION结构体的声明 文章目录 ReactOS系统中MM_REGION结构体的声明MM_REGION MM_REGION typedef struct _MM_REGION {ULONG Type;//MEM_COMMIT,MEM_RESERVEULONG Protect;//PAGE_READONLYY,PAGE_READ_WRITEULONG Length;…

2024护理类科技核心期刊汇总(最新版)

2024年9月中国科技核心期刊目录&#xff08;2024年版&#xff09;正式公布&#xff0c;13本护理类期刊入选。常笑医学整理了这13本护理类科技核心期刊的详细参数&#xff0c;以及投稿经验&#xff0c;供大家在论文投稿时参考&#xff0c;有需要的赶紧收藏&#xff01; 1.《中华…

基于Springboot+Vue的物流系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…