最全Windows版本jemalloc库(5.2.1)及其使用:包含动态库和静态库、x86版本和x64版本、debug版本和release版本

2021年09月15日 阅读数:3
这篇文章主要向大家介绍最全Windows版本jemalloc库(5.2.1)及其使用:包含动态库和静态库、x86版本和x64版本、debug版本和release版本,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

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

如何解决内存碎片呢?
在这里给你们安利一个举手之劳的好办法——重启应用
若是是客户端程序,能够经过退出重启的方式解决内存碎片的问题;不过对于服务器应用而言这样操做的风险比较大,但若是以为本身命硬也不妨尝试一下。windows

很差意思上面写错了,从新安利一下。缓存

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

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

1、下载地址

一、jemalloc各类库下载地址
二、jemalloc头文件下载地址
以下图:
分布式

请根据我的胃口下载不一样的jemalloc库,但include.zip必需要下载。memcached

2、开发环境准备

开发环境:vs2017或vs2015函数

一、创建一个控制台工程test_jemalloc
确保有main函数啊!高并发

二、配置include目录
下载 include.zip到指定目录,并解压拷贝到test_jemalloc工程下。
测试

若是不是在当前工程下,则须要写好绝对路径。

三、配置预处理器
由于本案例使用的是静态库,则须要在配置中加入以下宏定义(若是使用的是动态库则无需配置)。
JEMALLOC_EXPORT=
JEMALLOC_STATIC

3、测试源码


#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;
}

感谢您的阅读!