本文是多年前的一篇草稿.

目前项目中准备用hoard,恢复发布此文。

1.背景

das前置机和服务器有崩溃的情况,是否是大量请求时内存不足所致?
一个umx文件加载进内存,内存消耗为什么增大了非常多?
如几十M的文件,加载后内存暴增几百兆---以前有过此现象

2.测试与分析

hoard对此的改善有多大?

int new_buf(int times,int size) {
 for (int i=0;i<times;i++) {
  new char[size];
 }
 return 0;
}

void main {
 new_buf(1024*1024,1);

 return;
}

分别用使用和未使用hoard的hotfox测试new_buf前后的内存占用情况。
使用和未使用hoard的hotfox执行程序大小分别为:1,140K和1,516K.
(使用hoard的怎么还小呢?)

专用工作集/工作集:单位K

            未使用horad                 使用hoard
申请前     7,156 /16,848         10,292/19,796
申请后     39,956/49,664        10,800/ 20,312

从简单的对比测试有以下结论:
。使用hoard,初始时需要占用约3,000K内存
。申请内存后内存占用差异非常大,使用hoard能节省大量内存,而且感觉速度更快
。申请的内存为1024*1024*1字节,怎么使用hoard的增量只有500K呢(10,800-10,292)?


使用vector

#include <vector>
using namespace std;
vector<char*> g_v;
int new_buf(int times,int size) {
 for (int i=0;i<times;i++) {
  g_v.push_back(new char[size]);
 }
 return 0;
}


void main {
 int sz1 = sizeof(g_v); /// sz1=16
 new_buf(1024*1024,1);
 int sz2 = sizeof(g_v); /// sz2=16

 return;
}

            未使用horad                 使用hoard
申请前     7,184 /16,908        10,328/19,904
申请后     44,104/53,844       15,056/ 24,640

申请内存后的差异:
使用hoard增加了4,728K.
g_v元素占用内存: 1024*1024*4=4096K. (char*长度4字节). ---这2个数值很接近。

初步结论
.利用hoard后,内存使用效率会得到明显提高。针对umx开发一个分配器发挥空间不大.
.服务程序最好升级到64位程序.

这里介绍了另一个内存分配器,与hoard类似.
http://www.cppblog.com/feixuwu/archive/2010/07/10/119980.aspx

 

10-03 21:03