一个C++项目遇到内存碎片问题,尝试如下:
nedmalloc- 没有通过压力测试(15 小时后崩溃),这意味着它在大多数情况下都有效,但不是全部。并且比其他分配器使用更多的内存。
jemalloc- 还没有为 Windows 准备好?
tcmalloc- 使用带有静态链接的主机代码编译,但与 CRT 符号冲突。我可以只使用 tc_malloc(...) 之类的别名来构建自己的分配包装器吗?怎么做?
任何意见?提前致谢。
一个C++项目遇到内存碎片问题,尝试如下:
nedmalloc- 没有通过压力测试(15 小时后崩溃),这意味着它在大多数情况下都有效,但不是全部。并且比其他分配器使用更多的内存。
jemalloc- 还没有为 Windows 准备好?
tcmalloc- 使用带有静态链接的主机代码编译,但与 CRT 符号冲突。我可以只使用 tc_malloc(...) 之类的别名来构建自己的分配包装器吗?怎么做?
任何意见?提前致谢。
Visual Studio 2008、2010 和 2013 有 jemalloc 项目。 https://github.com/shines77/jemalloc-win32
我想这意味着 jemalloc 可以在 Windows 中使用。
但我还没有尝试过。自己检查一下。
在程序开始时使用此 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;
}
Intel 的 TBB 提供了一个可以工作的分配器。 http://threadingbuildingblocks.org/download.php
还有一些其他可用的分配器,例如doug lea 的 malloc (dlmalloc)或horde 分配器
nedmalloc- 没有通过压力测试(15 小时后崩溃),这意味着它在大多数情况下都有效,但不是全部。
看看你是否可以在放弃它之前追踪它首先崩溃的位置和原因,这可能只是你这边的一个错误,还检查了 ned 的 SVN 存储库,可能已经解决了你的问题。
tcmalloc- 使用带有静态链接的主机代码编译,但与 CRT 符号冲突。我可以只使用 tc_malloc(...) 之类的别名来构建自己的分配包装器吗?怎么做?
我会说最好保持 CRT 符号完好无损(以防万一),所以继续编辑项目,以便合并符号遵循您想要的约定(毕竟您有来源是有原因的)