這篇文章主要為大家詳細介紹了解決內(nèi)存碎片問題的方法,文中示例代碼介紹的非常詳細,圖文詳解容易學習,非常適合初學者入門。
成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供高安網(wǎng)站建設(shè)、高安做網(wǎng)站、高安網(wǎng)站設(shè)計、高安網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、高安企業(yè)網(wǎng)站模板建站服務(wù),十余年高安做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
經(jīng)常的new delete 導致可用內(nèi)存越來越小, 這就是內(nèi)存碎塊
就是內(nèi)存有各種各樣大小不一樣的節(jié)點 ,
長時間在 new delete 這時候操作系統(tǒng) 在內(nèi)存,
上分一塊內(nèi)存給你, 分出去了 好幾塊,內(nèi)存緊張了, 釋放這中間 就有一些內(nèi)存用不了
就是有一些很小的空閑內(nèi)存, 但是你申請的空間 可能就比他們要大,
什么東西需要防止內(nèi)存碎片呢?一般需要大量數(shù)據(jù)節(jié)點的,都需要自己的緩沖池
也就是根據(jù)系統(tǒng)的負載開一塊很大的內(nèi)存出來,比如一個在線用戶的信息 節(jié)點
因為你一天的活躍用戶可能上萬,但是當前可能在線的可能只有三千,五千
也就是你一天 會有成千上萬的用戶 上線, 如果去沖擊系統(tǒng)的new malloc
,那么就會造成內(nèi)存碎片為了 解決這個文件,就要對這些節(jié)點做緩沖池**
代碼設(shè)計
#define MAX_SESSION_NUM 6000 //緩沖池大小
#define my_malloc malloc
#define my_free free
//用戶節(jié)點結(jié)構(gòu)體
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 ;
//清空內(nèi)存
memset(&session_manager, 0, sizoef(session_manager));
//將6000節(jié)點 一次緩沖池分配出來
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{
//當可用緩沖池用完,防止程序奔潰 在極少數(shù)的情況下
//這時候就要調(diào)用系統(tǒng)的分配內(nèi)存
//少次數(shù)的調(diào)用malloc 不會引發(fā)內(nèi)存碎片
s = my_malloc(sizeof(struct session));
}
//情況當前內(nèi)存信息 應(yīng)為可能存在使用情況
memset(s,0, sizeof(struct session));
return s;
}
static void cache_free(struct session* s)
{
//判斷是從 cache 分配的 還是從系統(tǒng) malloc分配的
//只需要判斷 他的內(nèi)存范圍 是不是在這個分配的內(nèi)存里面
if (s >= session_manager.cache_mem && s < session_manager.cache_mem + MAX_SESSION_NUM)
{
//內(nèi)存不釋放
//當前使用的 上一個就是申請時 賦值給free_list的
s->_next = session_manager.free_list;
//記錄當前這個節(jié)點
session_manager.free_list = s;
}
else{//系統(tǒng)分配的
my_free(s);
}
}
這是上面的調(diào)試信息
以上就是解決內(nèi)存碎片問題的詳細介紹,內(nèi)容較為全面,而且我也相信有相當?shù)囊恍┕ぞ呖赡苁俏覀內(nèi)粘9ぷ骺赡軙姷交蛴玫降?。通過這篇文章,希望你能收獲更多。