在项目中可能存在这样一种情况,某些时刻需要大量的分配内存,并且是若干个且不是一致性分配的,如我们显示复合文档中的一些Path对象,如果是我们的代码不做任何处理,那么在进行这样的操作时,可能非常的慢或者直接Crash掉。
这时候我们要考虑定义自己的内存管理器了,首先让自己用的所用对象都继承一个公共的基类,BaseObject,然后需要重写里面的New操作运算符,子类便可以正常的使用了。分配的内存一般有链表型,和固定型。这里要注意的是,由申请重写的自定义管理器分配的内存,就要用自定义管理器的释放方法释放。由一般的申请的内存,就用一般的释放方法。要配套使用,不能混乱调用。
常见的内存管理器:MemoryManger,FixMemoryManger,GrowOnlyPool,Python内存管理器。然后涉及到GC,PRNG地址映射空间,和一些扫描算法。
这些内存管理器提升性能的本质就是:地址映射空间设置的合理,分配的紧密,使用的紧密,用密度来换空间。例如打开一个含有很多Path对象的复合文件,如果是按照系统的分配法则,可能分配的不是那么有规律,并且系统不知道要分配数量非常大的,这就导致了严重的内存碎片,倒不如一些性分配一些大的,然后在自己的分配中按照特定方式去计算查找要分配的数据地址。这就有点像是教授做的那个瓶子中塞物品的实验,看似满的瓶子 还是可以放一些小的物品。虽说巧妇难为无米之炊,但是精打细算的话,还是会好很多,表现在我们的宏观感受上,就是不会那么卡或者直接异常退出;
借助gFlags工具,来选取不同的内存分配器。
内存处理器应该还有做到碎片的处理Purge,要选取适当的处罚时机和策略进行回收。同时我们在做内存管理和监护时,最好让审计代码的同事,对整个工程进行跑起来分析,分析是哪个文件的哪一行,然后进行分析;包括我们的Core层代码都要进行这样的分析;千里之堤,毁于蚁穴,把这些小的细节考虑到,才会使得产品更加可靠有保证。