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

  2. Java流程控制04——Switch选择结构

    switch 多选择结构 switch case 语句判断一个变量与一系列值中某个值是否相等,每个支撑位一个分支. switch语句中的变量类型可以是: byte short int 或者 char ...

  3. Java基础——类型转换注意事项及常见问题

    类型转换 由于Java是强类型语言,所以要进行有些运算的时候,需要用类型转换 低------------------------------------------------------------ ...

  4. 靶机CH4INRULZ_v1.0.1

    nmap开路. root@kali:~# nmap -sP 192.168.1.* //拿到靶机地址192.168.1.8 root@kali:~# nmap -p- -sS -v -sV 192.1 ...

  5. java数据类型和类型得转换

    java数据类型 强类型语言 ​ Java是一种强类型得语言,严格要求变量要符合规定,所有变量都必须先定义再使用 java得数据类型分为两大类 值得注意得是String并不是一个数据类型,它是一个类 ...

  6. 05.表达式目录树Expression

    参考文章 https://www.cnblogs.com/xyh9039/p/12748983.html 1. 基本了解 1.1 Lambda表达式 演变过程 using System; namesp ...

  7. noip13

    T1 一开始直接丢了个暴力走人50pts,然后开始打表找规律,啥也没找着,最后二十分钟突然看出来了什么,把 \(f_{n,m}\)式子列了一下,发现常数项没啥规律,最后五分钟,突然闪过一丝灵感,但是是 ...

  8. HttpClient 4.3教程-前言

    前言 Http协议应该是互联网中最重要的协议.持续增长的web服务.可联网的家用电器等都在继承并拓展着Http协议,向着浏览器之外的方向发展. 虽然jdk中的java.net包中提供了一些基本的方法, ...

  9. ArcGIS图层添加字段出现:“定义了过多字段”

    首先,我图层数据格式为mdb,也就是Access数据库 Access一个表最大支持255个字段,可是我的才添加第一个字段就出现"定义了过多字段"的错误 打开ArcMap添加字段也是 ...

  10. 从eclipse转idea不适记录【持续更新】

    使用eclipse和idea时,快捷键对比 从一些最扎心的开始: 关于print一类的打印输出:System.out.println()补全 idea中可以sout.souf.serr:分别对应out ...