如何解决内存碎片问题-创新互联
这篇文章主要为大家详细介绍了解决内存碎片问题的方法,文中示例代码介绍的非常详细,图文详解容易学习,非常适合初学者入门。
创新互联公司专注于企业全网营销推广、网站重做改版、罗山网站定制设计、自适应品牌网站建设、H5建站、成都商城网站开发、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为罗山等各大城市提供网站开发制作服务。经常的new delete 导致可用内存越来越小, 这就是内存碎块
就是内存有各种各样大小不一样的节点 ,
长时间在 new delete 这时候操作系统 在内存,
上分一块内存给你, 分出去了 好几块,内存紧张了, 释放这中间 就有一些内存用不了
就是有一些很小的空闲内存, 但是你申请的空间 可能就比他们要大,
什么东西需要防止内存碎片呢?一般需要大量数据节点的,都需要自己的缓冲池
也就是根据系统的负载开一块很大的内存出来,比如一个在线用户的信息 节点
因为你一天的活跃用户可能上万,但是当前可能在线的可能只有三千,五千
也就是你一天 会有成千上万的用户 上线, 如果去冲击系统的new malloc
,那么就会造成内存碎片为了 解决这个文件,就要对这些节点做缓冲池**
代码设计
#define MAX_SESSION_NUM 6000 //缓冲池大小
#define my_malloc malloc
#define my_free free
//用户节点结构体
struct session{
char c_ip[32];
int c_port;
int c_sock;
struct session * _next;
};
struct {
struct session* online_session;
struct session* cache_mem; //缓存池
struct session* free_list; //链表头指针
}session_manager ;
//清空内存
memset(&session_manager, 0, sizoef(session_manager));
//将6000节点 一次缓冲池分配出来
session_manager.cache_mem = (struct session*)my_malloc(MAX_SESSION_NUM * sizeof(struct session));
memset(session_manager.cache_mem, 0, MAX_SESSION_NUM * sizeof(struct session));
//把没有使用的list全部放在 free_list 链表
for (int i = 0; i_next;
}
else{
//当可用缓冲池用完,防止程序奔溃 在极少数的情况下
//这时候就要调用系统的分配内存
//少次数的调用malloc 不会引发内存碎片
s = my_malloc(sizeof(struct session));
}
//情况当前内存信息 应为可能存在使用情况
memset(s,0, sizeof(struct session));
return s;
}
static void cache_free(struct session* s)
{
//判断是从 cache 分配的 还是从系统 malloc分配的
//只需要判断 他的内存范围 是不是在这个分配的内存里面
if (s >= session_manager.cache_mem && s < session_manager.cache_mem + MAX_SESSION_NUM)
{
//内存不释放
//当前使用的 上一个就是申请时 赋值给free_list的
s->_next = session_manager.free_list;
//记录当前这个节点
session_manager.free_list = s;
}
else{//系统分配的
my_free(s);
}
}
这是上面的调试信息
以上就是解决内存碎片问题的详细介绍,内容较为全面,而且我也相信有相当的一些工具可能是我们日常工作可能会见到或用到的。通过这篇文章,希望你能收获更多。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网站标题:如何解决内存碎片问题-创新互联
网站路径:http://pwwzsj.com/article/docssg.html