我有一个长期存在的应用程序,频繁的内存分配 - 释放.任何malloc实现都会将释放的内存返回给系统吗?
在这方面,什么是以下行为:
如果我有一个应用程序,其白天和夜晚的内存消耗可能非常不同(例如),我可以强制任何malloc将系统释放的内存吗?
如果没有这样的返回,释放的内存将被多次换出,但这样的内存只包含垃圾.
tcmalloc/jemalloc是改进的内存分配器,并且还引入了内存池以实现更好的内存分配.那么它们之间有什么区别以及如何在我的应用程序中选择它们呢?
我有一个分配大量内存的应用程序,我正在考虑使用比malloc更好的内存分配机制.
我的主要选择是:jemalloc和tcmalloc.使用它们中的任何一个是否有任何好处?
在http://locklessinc.com/benchmarks.shtml中 ,一些机制(包括作者的专有机制 - 无锁)之间有一个很好的比较,它提到了每个机制的优点和缺点.
鉴于这两种机制都是积极的并且不断改进.有没有人对这两者的相对表现有任何见解或经验?
首先,我想知道如何TCmalloc
在Ubuntu中安装.然后我需要一个程序使用TCmalloc
.然后我需要一个小程序来表明它TCmalloc
比工作更好PTmalloc
.
基本上,我需要一个内存池来快速分配小对象.理想情况下,我想替换主机上的分配,以及使用cudaMalloc在GPU上分配的内存.我可以写自己的,如果必须,我会,但我不介意交换一个可靠的开源实现.
唯一的问题是,使用cudaMalloc,内存池无法触及分配的内存.我的理解是,许多(所有?)公共内存分配器(如标题中的那些)在分配的数据中存储少量元数据.因此它们不起作用.
有没有人知道一个内存分配器,但事实并非如此?
当我使用时LD_PRELOAD=/usr/local/lib/libtcmalloc.so
,我对malloc的所有调用都变成了tcmalloc调用.但是,当我静静地链接到libtcmalloc时,我发现直接malloc被调用,除非我仍然使用该LD_PRELOAD
设置.
那么我怎么能以这样的方式静态编译tcmalloc,使我的mallocs挂钩到tcmalloc?
笔记:
我安装了包libtcmalloc-minimal0
但是当我尝试使用flag编译我的程序时
-ltcmalloc-minimal0
我收到了错误
/ usr/bin/ld:找不到-ltcmalloc_minimal0
我检查了/ usr/lib,库就在那里
更多信息
dpkg给出以下o/p
dpkg -L libtcmalloc-minimal0
/.
/usr
/usr/lib
/usr/lib/libtcmalloc_minimal.so.0.0.0
/usr/lib/libtcmalloc_minimal_debug.so.0.0.0
/usr/share
/usr/share/doc
/usr/share/doc/libtcmalloc-minimal0
/usr/share/doc/libtcmalloc-minimal0/TODO
/usr/share/doc/libtcmalloc-minimal0/AUTHORS
/usr/share/doc/libtcmalloc-minimal0/copyright
/usr/share/doc/libtcmalloc-minimal0/changelog.gz
/usr/share/doc/libtcmalloc-minimal0/README.gz
/usr/share/doc/libtcmalloc-minimal0/changelog.Debian.gz
/usr/lib/libtcmalloc_minimal.so.0
/usr/lib/libtcmalloc_minimal_debug.so.0
Run Code Online (Sandbox Code Playgroud)
我正在编译64位模式
和库也是64位
file /usr/lib/libtcmalloc_minimal.so.0.0.0
/usr/lib/libtcmalloc_minimal.so.0.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped
Run Code Online (Sandbox Code Playgroud) 我想用一个高性能通用分配器喜欢jemalloc
/ tcmalloc
有一个内存池.这样做有指导吗?我不想使用jemalloc
/ tcmalloc
作为替代品malloc
.
我有内存池使用libarena
和雕刻一个较大的内存区域(2GB).我想gslice
在这个竞技场上创建固定大小的对象池,例如1 GB.(像Bonwick slab分配器一样)并且希望将剩余的内存用于可变大小的通用分配.我想拥有jemalloc
/ tcmalloc
使用这个记忆区域.这可能吗?关于如何进行的任何想法?如果有一个备用库,我也想听听它.
我的应用程序打印几行如:
tcmalloc: large alloc 4294488064 bytes == 0x2b968d8000 @ 0x727432 0x727302 0x727a58 0x75a07d 0x574beb 0x585756 0x5575df 0x5717db 0x57108f 0x58078c 0x302b80610a
tcmalloc: large alloc 4294488064 bytes == 0x2c97063000 @ 0x727432 0x727302 0x727a58 0x75a07d 0x574beb 0x585756 0x5575df 0x5717db 0x57108f 0x58078c 0x302b80610a
tcmalloc: large alloc 4294488064 bytes == 0x2b968d8000 @ 0x727432 0x727302 0x727a58 0x75a07d 0x574beb 0x585756 0x5575df 0x5717db 0x57108f 0x58078c 0x302b80610a
Run Code Online (Sandbox Code Playgroud)
这条消息来自哪里?这是否意味着我的应用程序有一些错误或内存泄漏?我该如何追查根本原因?
我有一个要与tcmalloc集成的64位Visual Studio 2010(单线程)C ++ Windows应用程序,使用任何动态链接的dll时都遇到问题。我将tcmalloc链接为静态库。tcmalloc可以很好地工作,直到应用程序开始使用我们共享的dll之一。我将解决方案构建为64位DEBUG应用程序。dll的所有链接都与CRT库的C / C ++调试版本(MSVCP100D.dll和MVCR100D.dll)链接。
以下是失败代码的示例。将为所有内存分配调用tcmalloc,但是调用delete时,应用程序崩溃。当我在主可执行文件中创建函数并将代码复制到那里时,完全相同的代码可以正常工作,这让我感到非常困惑。
如果有人在这种情况下使用tcmalloc有任何经验,我将感谢您的反馈。这对我来说是个谜。dll的内存模型问题(不同的堆??)吗?我不知道。在我看来,他们正在使用同一堆。
抱歉,如果这篇文章太长。我试图提供尽可能多的信息。
谢谢。
布鲁斯
更新:作为测试,我将崩溃的共享dll更改为静态库,并且一切正常,直到应用程序使用其他dll。因此,无论出于何种原因,tcmalloc都需要一些其他步骤来处理共享的dll。我可以使用tcmalloc来制作所有dll的静态库以进行内存分析,但是,知道将tdllalloc与共享dll一起使用还需要做些什么,这真的很高兴。
DLL标头文件方法声明:__declspec(dllexport)static std :: string GetExecutablePath();
//.cpp实现
string Parameters::GetExecutablePath()
string execPathStr;
char exeFilePath[ MAX_PATH +1];
if ( GetModuleFileName( NULL, exeFilePath, MAX_PATH ) )
{
//The line of code below is where the app crashes.
//It calls operator new in crt/src/new.cpp. I verified the call to malloc
//is forwarded to tcmalloc.
*execPathStr = string(exeFilePath);* //creates and deletes a temporary and then crashes
long dir_pos = execPathStr.rfind( FT_DIR_SLASH ) …
Run Code Online (Sandbox Code Playgroud)