2

一个C++项目遇到内存碎片问题,尝试如下:

  1. nedmalloc- 没有通过压力测试(15 小时后崩溃),这意味着它在大多数情况下都有效,但不是全部。并且比其他分配器使用更多的内存。

  2. jemalloc- 还没有为 Windows 准备好?

  3. tcmalloc- 使用带有静态链接的主机代码编译,但与 CRT 符号冲突。我可以只使用 tc_malloc(...) 之类的别名来构建自己的分配包装器吗?怎么做?

任何意见?提前致谢。

4

4 回答 4

1

Visual Studio 2008、2010 和 2013 有 jemalloc 项目。 https://github.com/shines77/jemalloc-win32

我想这意味着 jemalloc 可以在 Windows 中使用。

但我还没有尝试过。自己检查一下。

于 2015-02-19T19:53:37.467 回答
1

在程序开始时使用此 API将您的项目设置为使用 Windows 低碎片堆 (LFH) 。这可能会解决您的问题,而无需对自定义实现进行更多工作。

示例代码,直接取自 MSDN:

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

#define HEAP_LFH 2

int __cdecl _tmain()
{
    BOOL bResult;
    HANDLE hHeap;
    ULONG HeapInformation;

    // 
    // Note: The HeapSetInformation function is available on Windows 2000 with SP4
    // only if hotfix KB 816542 is installed. To run this example on Windows 2000,
    // use GetProcAddress to get a pointer to the function if available.
    //

    //
    // Enable heap terminate-on-corruption. 
    // A correct application can continue to run even if this call fails, 
    // so it is safe to ignore the return value and call the function as follows:
    // (void)HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
    // If the application requires heap terminate-on-corruption to be enabled, 
    // check the return value and exit on failure as shown in this example.
    //
    bResult = HeapSetInformation(NULL,
                                 HeapEnableTerminationOnCorruption,
                                 NULL,
                                 0);

    if (bResult != FALSE) {
        _tprintf(TEXT("Heap terminate-on-corruption has been enabled.\n"));
    }
    else {
        _tprintf(TEXT("Failed to enable heap terminate-on-corruption with LastError %d.\n"),
                 GetLastError());
        return 1;
    }

    //
    // Create a new heap with default parameters.
    //
    hHeap = HeapCreate(0, 0, 0);
    if (hHeap == NULL) {
        _tprintf(TEXT("Failed to create a new heap with LastError %d.\n"),
                 GetLastError());
        return 1;
    }

    //
    // Enable the low-fragmenation heap (LFH). Starting with Windows Vista, 
    // the LFH is enabled by default but this call does not cause an error.
    //
    HeapInformation = HEAP_LFH;
    bResult = HeapSetInformation(hHeap,
                                 HeapCompatibilityInformation,
                                 &HeapInformation,
                                 sizeof(HeapInformation));
    if (bResult != FALSE) {
        _tprintf(TEXT("The low-fragmentation heap has been enabled.\n"));
    }
    else {
        _tprintf(TEXT("Failed to enable the low-fragmentation heap with LastError %d.\n"),
                 GetLastError());
        return 1;
    }

    return 0;
}
于 2010-09-28T11:13:52.137 回答
0

Intel 的 TBB 提供了一个可以工作的分配器。 http://threadingbuildingblocks.org/download.php

于 2011-07-07T21:10:58.620 回答
0

还有一些其他可用的分配器,例如doug lea 的 malloc (dlmalloc)horde 分配器


nedmalloc- 没有通过压力测试(15 小时后崩溃),这意味着它在大多数情况下都有效,但不是全部。

看看你是否可以在放弃它之前追踪它首先崩溃的位置和原因,这可能只是你这边的一个错误,还检查了 ned 的 SVN 存储库,可能已经解决了你的问题。

tcmalloc- 使用带有静态链接的主机代码编译,但与 CRT 符号冲突。我可以只使用 tc_malloc(...) 之类的别名来构建自己的分配包装器吗?怎么做?

我会说最好保持 CRT 符号完好无损(以防万一),所以继续编辑项目,以便合并符号遵循您想要的约定(毕竟您有来源是有原因的)

于 2010-09-28T09:30:43.197 回答