编写服务器程序时,需要频繁的申请和释放内存,长时间运行会产生大量的内存碎片,这就导致即使当前系统中的闲置内存还足够多,但也无法申请到大的连续可用的内存块,因为此时的物理内存已经千疮百孔像个马蜂窝。此外,在高并发的情况下频繁的malloc/free也是一笔额外的cpu负担。

如何解决内存碎片呢?

在这里给大家安利一个举手之劳的好办法——重启应用

如果是客户端程序,可以通过退出重启的方式解决内存碎片的问题;不过对于服务器应用而言这样操作的风险比较大,但如果觉得自己命硬也不妨尝试一下。

不好意思上面写错了,重新安利一下。

通常情况下服务器程序会在内部实现一套自己的内存分配和管理机制,用于解决内存碎片和速度的问题。比如分布式缓存服务memcached就是用Slab Allocator来分配和管理内存。但对于大部分应用而言,自己单独造轮子的成本还是比较高的,一旦管理不善,可能会引入更多的问题。如果有现成的开源内存管理库可用,是再好不过的。相较于memcached,另一个高速缓存redis就是拿来主义直接使用开源的内存管理库,内部集成了google的tcmalloc和jemalloc。redis的windows版本是用的是jemalloc库。

说了这么多废话,回归正题,如何调用jemalloc库,本案例使用的是x86静态库。

一、下载地址

1、jemalloc各种库下载地址

2、jemalloc头文件下载地址

如下图:

请根据个人胃口下载不同的jemalloc库,但include.zip必须要下载。

二、开发环境准备

开发环境:vs2017或vs2015

1、建立一个控制台工程test_jemalloc

确保有main函数啊!

2、配置include目录

下载 include.zip到指定目录,并解压拷贝到test_jemalloc工程下。

如果不是在当前工程下,则需要写好绝对路径。

3、配置预处理器

因为本案例使用的是静态库,则需要在配置中加入如下宏定义(如果使用的是动态库则无需配置)。

JEMALLOC_EXPORT=

JEMALLOC_STATIC

三、测试源码


#include <stdio.h>
#include <time.h> // for clock()
#include <assert.h>
#include "jemalloc/jemalloc.h" // “配置属性”->“C/C++”->“常规”->“附加包含目录” //#define USE_JEMALLOC // 重载malloc/free
#ifdef 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 // 当前使用的是jemalloc静态库
#ifdef _DEBUG
#pragma comment(lib,"jemalloc-x86-Debug-static.lib")
#else
#pragma comment(lib,"jemalloc-x86-Release-static.lib")
#endif int main()
{
int i = 0;
int iCount = 50000;
int iSize = 1000; // malloc
clock_t cStart = ::clock();
for (i = 0; i < iCount; i++)
{
void* pMem = malloc(iSize);
assert(pMem);
free(pMem);
}
clock_t cSpan1 = ::clock() - cStart; // jemalloc
cStart = ::clock();
for (i = 0; i < iCount; i++)
{
void* pMem = je_malloc(iSize);
assert(pMem);
je_free(pMem);
}
clock_t cSpan2 = ::clock() - cStart; printf("malloc span time = %d, jemalloc span time = %d\r\n", cSpan1, cSpan2); printf("press any key exit......\r\n");
getchar();
return 0;
}

感谢您的阅读!

最全Windows版本jemalloc库(5.2.1)及其使用:包含动态库和静态库、x86版本和x64版本、debug版本和release版本的更多相关文章

  1. MFC下debug改成release版本出现问题及解决办法

    自己在debug下成功运行了自己写的测试自己写第三方库的程序,这里有用到opencv库,所以同时用到了自己的库和opencv的库,需求因为要进行速度的测试,是想要把debug改成release版本,这 ...

  2. 【原】IOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突)

    网上流传了太多关于合并lib库的方法,自己也尝试过,但大多失败.有感于这种急于解决问题,经过百般尝试后依旧无果的无奈心情,小翁在这里用一个实例来完整阐述如何在mac中合并lib静态库. 这里以移动广告 ...

  3. Qt下使用的静态链接库------ *.lib转化为mingw使用的.a格式的静态库

    使用MinGW附带的工具reimp.exe,该工具一般在MinGW in目录下,其readme文档在MinGWdoc eimp目录下, 方法很简单,比如: C:CodeBlocksMinGWlibdx ...

  4. Debug不崩溃Release版本崩溃的一种原因

    今天有一个工程Debug是正常,Release崩溃,郁闷至极. 研究了一下下午,原因是一个类成员变量没有构造函数中初始化.而Debug版本正好没有问题. 所以定义类成员,一定不能忘记初始化!!

  5. 动态库dll使用module.def文件导出函数(像静态库一样使用)

    1.新建文件module.def. 2.动态库工程上右键->属性->链接器->输入->模块定义文件编辑它写入module.def 3.下面为module.def实例(smart ...

  6. c/c++:动态库 静态库 linux/windows 例子 (转)

    作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). C++静 ...

  7. windows中静态库lib和动态dll的区别及使用方法

    1. 静态库lib和动态dll的区别 1.1 项目类型 VS在建Win32项目时,有以下选项: windows应用程序控制台应用程序DLL静态库最后两个类型:DLL和静态库,这两种项目类型是不可以单独 ...

  8. 【C/C++开发】C++静态库与动态库以及在Linux和Windows上的创建使用

    原文出处: 吴秦的博客    这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学 ...

  9. Windows静态库和动态库的创建和使用

    偶们在实际的编程开发中,经常会遇到运行时无法找到某个DLL文件或者链接时无法找到某个LIB文件.然后,我们就开始乱GOOGLE一下,然后将VS2005的设置改变一下,或许就Ok了,我们将别人开发的DL ...

  10. Windows静态库和动态库的创建和使用(VS2005)

    偶们在实际的编程开发中,经常会遇到运行时无法找到某个DLL文件或者链接时无法找到某个LIB文件.然后,我们就开始乱GOOGLE一下,然后将VS2005的设置改变一下,或许就Ok了,我们将别人开发的DL ...

随机推荐

  1. 如何实现让div垂直居中,左右10px,高度始终为宽度一半

    方法一:利用height:0; padding-bottom: 50%; <!DOCTYPE html><html lang="en"> <head& ...

  2. 5年Android开发诉苦:47天21家面试,半年空档期觉得整个人生都被毁了

    近日,我在逛某社交论坛时,发现一位做了五年的Android开发将自己这段时间的所有面试经历发表了出来,根据网友自己提供的信息显示,主要面试的地点都在北京,上海等地. 微软和亚马逊刚面试完一面,都是以算 ...

  3. java环境的配置——实现win10下双击直接运行jar文件

    java环境的配置--实现win10下双击直接运行jar文件 在渗透测试的过程中很多工具的安装和使用需要java环境,下面我来介绍一下java环境配置的超详细步骤(包含怎样实现win10下双击直接运行 ...

  4. PaddlePaddle之猫狗大战(本地数据集)

    新手入门PaddlePaddle的一个简单Demo--猫狗大战 主要目的在于整体了解PP用卷积做图像分类的流程,以及最最重要的掌握自定义数据集的读取方式 猫狗数据集是从网络上下载到工作目录的. 本项目 ...

  5. WPF 图表控件之曲线绘制与移动

    目的:绘制简单轻量级的曲线视图 二.实现效果: 1,绘制标准基准线 2,可拖动 三.用到控件 1,Canvas 2,Ellipse XAML代码: <Canvas Background=&quo ...

  6. 基于Apache Hudi构建数据湖的典型应用场景介绍

    1. 传统数据湖存在的问题与挑战 传统数据湖解决方案中,常用Hive来构建T+1级别的数据仓库,通过HDFS存储实现海量数据的存储与水平扩容,通过Hive实现元数据的管理以及数据操作的SQL化.虽然能 ...

  7. MySQL Mac 终端环境变量配置

    MySQL Mac 终端环境变量配置 这里安装的是mysql-8.0.26-macos11-x86_64,M1Mac,原本打算安装arm64版本,但一直安装不了,就装了x86版本 安装完成MySQL之 ...

  8. SQL 练习6

    查询在 SC 表存在成绩的学生信息 SELECT * from Student WHERE SId in (SELECT SId from SC)

  9. SpringBoot监听redis过期key

    开启过期监听 vim /etc/redis.conf 取消notify-keyspace-events Elg的注释 pom.xml 添加: <dependency> <groupI ...

  10. GIT基础篇,配置账号及命令查看以及帮助命令

    提交用户名和邮件地址   1 安装完Git首先要设置你的用户名称与邮件地址.每一个Git的提交都会使用这些信息,并且它会写入到你的每一次提交中. 2 git config --global user. ...