gpt4 book ai didi

c++ - 如何解决内存碎片

转载 作者:IT老高 更新时间:2023-10-28 14:00:00 26 4
gpt4 key购买 nike

我们偶尔会遇到问题,即我们的长时间运行的服务器进程(在 Windows Server 2003 上运行)由于内存分配失败而引发异常。我们怀疑这些分配由于内存碎片而失败。

因此,我们一直在寻找一些可能对我们有所帮助的替代内存分配机制,我希望有人能告诉我最好的一种:

1) 使用 Windows Low-fragmentation Heap

2) jemalloc - 在 Firefox 3 中使用

3) Doug Lea 的 malloc

我们的服务器进程是使用跨平台的 C++ 代码开发的,因此理想的解决方案也是跨平台的(*nix 操作系统会遭受这种类型的内存碎片吗?)。

另外,我认为 LFH 现在是 Windows Server 2008/Vista 的默认内存分配机制是否正确?...如果我们的客户只是升级他们的服务器操作系统,我当前的问题会“消失”吗?

最佳答案

首先,我同意其他建议资源泄漏的海报。你真的想先排除这种可能性。

希望您当前使用的堆管理器能够转储堆中的实际可用总空闲空间(跨所有 空闲 block )以及它的 block 总数分了。如果平均空闲 block 大小与堆中的总空闲空间相比相对较小,那么您确实存在碎片问题。或者,如果您可以转储最大空闲 block 的大小并将其与总空闲空间进行比较,那将完成同样的事情。如果您遇到碎片,最大的空闲 block 相对于所有 block 中可用的总可用空间会很小。

要非常清楚上述内容,在所有情况下,我们都在讨论堆中的空闲 block ,而不是堆中分配的 block 。无论如何,如果不满足上述条件,那么您确实有某种泄漏情况。

因此,一旦您排除了泄漏,您可以考虑使用更好的分配器。问题中建议的 Doug Lea 的 malloc 对于一般用途的应用程序来说是一个非常好的分配器,并且大多数时间都非常健壮。换句话说,它已耗时测试,可以很好地适用于大多数应用程序。然而,没有一种算法适合所有应用程序,任何管理算法方法都可能被与其设计相悖的病态条件破坏。

为什么会遇到碎片问题? - 碎片问题的来源是由应用程序的行为引起的,并且与同一应用程序的分配生命周期大不相同内存竞技场。也就是说,一些对象会定期分配和释放,而其他类型的对象会在同一个堆中持续很长时间......将生命周期较长的对象视为在竞技场的更大区域中戳洞,从而防止合并已释放的相邻 block 。

要解决此类问题,您可以做的最好的事情是在逻辑上将堆划分为生命周期更相似的子区域。实际上,您需要一个临时堆和一个或多个持久堆,它们将具有相似生命周期的事物组合在一起。

其他一些人提出了另一种解决该问题的方法,即尝试使分配大小更相似或相同,但这不太理想,因为它会创建一种称为内部碎片的不同类型的碎片 - 这实际上是浪费通过在 block 中分配比您需要的更多的内存来获得空间。

此外,使用像 Doug Lea 那样好的堆分配器,使 block 大小更相似是不必要的,因为分配器已经在执行两倍大小的分桶方案,这将完全没有必要人为地调整传递的分配大小到 malloc() - 实际上,他的堆管理器会自动为您执行此操作,比应用程序能够进行的调整要强大得多。

关于c++ - 如何解决内存碎片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com