支离破碎的内存块所带来的危险

ZDNet软件频道 时间:2003-09-19 作者:ZDNet China |  我要评论()
本文关键词:
如果应用程序频繁的进行动态分配和释放内存,那么当其长期运行后,它们的效率就会逐渐下降。在一些情形下,即使应用程序没有出现任何内存泄漏,但应用程序不久也会出现崩溃。
本文译自Builder.com,未经许可请勿转载如果应用程序频繁的进行动态分配和释放内存,那么当其长期运行后,它们的效率就会逐渐下降。在一些情形下,即使应用程序没有出现任何内存泄漏,但应用程序不久也会出现崩溃。这是由于不断的动态分配、释放内存的行为使堆变得支离破碎。特别当应用程序每次分配的内存块都比较小时,尤其如此。

支离破碎的堆中包含有许多的自由块(即:没有使用的存储区域),但这些自由块一般都比较小,而且是不相邻的。为了说明这个问题,看看下面的图解。这个图解代表了系统中的一个堆:0表示是自由块,1表示是分配块(即:使用中的存储区域)。

100101010000101010110

虽然,上述堆中总共有12个自由块,但是,如果试着从这个有太多碎片的堆中分配出5个单位的自由块(即:5个0),肯定会失败的。另外,下面的一个堆中自由块虽然比上面的少,但是它却没有碎片:

1111111111000000

想要避免支离破碎的堆,就要尽量少用动态分配内存。在大多数情况下,使用静态存储或自动存储。试着每次分配一个较大的内存块,而不是较小的内存块。例如:要一次性分配一批对象,而不要只是分配单一的对象,然后只要在需要时使用它们即可。

如果上述的办法都不能解决内存碎片问题,你就应当考虑根据你自己的需求,量身打造一个内存池。



责任编辑:炒饭

欢迎评论投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134