编写服务器程序时,需要频繁的申请和释放内存,长时间运行会产生大量的内存碎片,这就导致即使当前系统中的闲置内存还足够多,但也无法申请到大的连续可用的内存块,因为此时的物理内存已经千疮百孔像个马蜂窝。此外,在高并发的情况下频繁的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. Windows协议 LDAP篇 - 域用户和计算机用户

    域用户 查询域用户 通过SAMR协议查询(net user就是通过这种协议查询的),samr也不是一种专门的协议,是一个RPC接口 在impacket里有个脚本samrdump.py,就是专门调用这个 ...

  2. 代码中如何优化过多的if..else

    针对代码中,过多的  if ... else ..,如何优化减少if else呢?(非常重要的优化技巧) 缺点:过多的if else 导致阅读不方便,逻辑过于复杂,代码多长. 解决方法:可以采用多个方 ...

  3. MyBaits学习03(ResultMap和分页)

    5.ResultMap 5.1 查询为null问题 要解决的问题:属性名和字段名不一致 环境:新建一个项目,将之前的项目拷贝过来 1.数据库里的属性 2.Java中的实体类设计 public clas ...

  4. Java服务突然失败:A fatal error has been detected by the Java Runtime Environment的总结

    服务启动以后过段时间自动失败:A fatal error has been detected by the Java Runtime Environment 控制台中的错误信息 A fatal err ...

  5. Java基础技术-Java其他主题【面试】

    Java基础技术-Java其他主题[面试] Java基础技术IO与队列 Java BIO.NIO.AIO Java 中 BIO.NIO.AIO 的区别是什么? 含义不同: BIO(Blocking I ...

  6. 说说XXE漏洞那些事

    想不起来写点啥了,又是摸鱼的一天,看了一些红队大佬们整理的资料,非常精彩,于是一个咸鱼翻身先选了一些简单的小点来写一写个人的感想(后续会继续更新其他内容) 不能说写的是技术分享,因为师傅们的文章珠玉在 ...

  7. MATLAB—数组运算及数组化编程

    文章目录 前言 一.数组的结构和创建 1.数组及其结构 2.行数组的创建 3.对数组构造的操作 二.数组元素编址及寻访 1.数组元素的编址 2.二维数组元素的寻访 三.数组运算 非数的问题 前言 编程 ...

  8. luogu P4206 聪聪和可可

    聪聪和可可 鸽了两天 \(dijkstra\)预处理出来两点之间的最短路径\(dis\)数组,读题发现,\(cat\)的走位很怪sb斩了,所以我们设一个\(next\)数组,\(next[i][j]\ ...

  9. kubebuilder实战之三:基础知识速览

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  10. idea的properties文件乱码问题解决

    设置编码格式: File============>Settings,打开设置后,设置成下面的即可解决: