我正在寻找一种方法来跟踪C++程序中的内存分配.我对内存泄漏不感兴趣,这似乎是大多数工具试图找到的,而是为应用程序创建内存使用情况配置文件.理想输出可以是函数名称的大列表加上随时间推移的最大分配字节数,也可以是更好的堆积随时间变化的图形表示.横轴是时间,纵轴堆空间.每个函数都会获得它自己的颜色,并根据分配的堆字节绘制线条.用于识别分配的对象类型的加分点.
我们的想法是找到内存瓶颈/可视化哪些函数/线程消耗最多的内存,并且应针对进一步优化.
我简要地看了一下Purify,BoundsChecker和AQTime,但它们似乎并不像我追求的那样.Valgrind看起来很合适,但是,我在Windows上.Memtrack看起来很有前景,但需要对源代码进行重大更改.
我的谷歌技能一定让我失望了,因为它似乎不是这么罕见的要求吗?创建这样的工具所需的所有信息都应该可以从程序的调试符号和运行时API调用中获得 - 不是吗?
我从IBM获得了一些名为"从Java代码到Java堆:了解应用程序的内存使用情况"的幻灯片,它说,当我们使用String而不是char[],
单个字符的最大开销为24:1!
但是我无法理解这里提到的开销.有人可以帮忙吗?
资源 :

我知道如何使用GlobalMemoryStatusEx获取系统内存,但这告诉我整个操作系统正在使用的内容.
我真的希望我的程序能够报告它单独分配和使用的内存量.
我的Delphi 2009程序中是否有任何方法可以调用Windows函数或某些FastMM函数来查找我的程序单独分配的内存?
重新审视我的问题,我现在已经通过@apenwarr更改了我对GetMemoryManagerState答案的接受答案.它产生了与我以前使用的GetHeapStatus函数(现已弃用)相同的结果,而GetProcessMemoryInfo.WorkingSetSize给出了非常不同的结果.
在典型的真实世界的程序中,内存分配/释放有多大的瓶颈?任何类型的程序通常都很重要的答案是受欢迎的.malloc/free/garbage收集的正确实现是否足够快,以至于它只是少数极端情况下的瓶颈,或者大多数性能关键型软件都会从尝试保持内存分配量下降或拥有更快的malloc/free /中获益匪浅垃圾收集实施?
注意:我不是在谈论实时的东西.对性能至关重要,我的意思是吞吐量很重要,但延迟并不一定.
编辑:虽然我提到了malloc,但这个问题不是针对C/C++的.
malloc optimization performance garbage-collection memory-management
如果我的应用程序有太多静态变量或方法,那么根据定义,它们将存储在堆中.如果我错了,请纠正我
1)在应用程序关闭之前,这些变量是否会在堆上?
2)他们可以随时使用GC吗?如果没有,我可以说它是内存泄漏?
我正在开发一个实时媒体浏览/回放应用程序,它使用<video>浏览器中的对象进行回放(如果可用).
我正在使用直接javascript和jQuery的混合,
我关心的是记忆.应用程序永远不会在窗口中重新加载,并且用户可以观看许多视频,因此随着时间的推移,内存管理成为一个大问题.在今天的测试中,我看到内存配置文件按照每个后续加载流式传输的视频大小跳跃,并且永远不会回落到基线.
我尝试了以下相同的结果:
1 - 清空包含已创建元素的父容器,例如:
$(container_selector).empty();
Run Code Online (Sandbox Code Playgroud)
2 - 暂停并删除匹配"视频"的子项,然后清空父容器:
$(container_selector).children().filter("video").each(function(){
this.pause();
$(this).remove();
});
$(container_selector).empty();
Run Code Online (Sandbox Code Playgroud)
有没有其他人遇到这个问题,有没有更好的方法来做到这一点?
由于我正在计划一个将大量数据保存在内存中的应用程序,我希望有一种"紧凑"的字符串类,至少有一个字符串格式不超过字符串的零终止ASCII版本.
你知道任何这样的字符串类实现 - 它应该有一些实用函数,如原始字符串类.
编辑:
我需要对字符串进行排序并能够扫描它们,只是提到我将使用的一些操作.
理想情况下,它将与System.String源兼容,因此基本的搜索和替换操作将优化应用程序内存占用.
号码:
我可以拥有每条记录的100k记录,最多10个字符串,包含30-60个字符.所以:
100000x10x60 = 60000000 = 57mega字符.为什么不使用60兆公羊而不是120兆公羊?操作会更快,一切都会更紧.
树将用于搜索,但对我计划拥有的正则表达式扫描没有帮助.
我有很多boost::shared_ptr<MyClass>对象,在某些时候我故意想要delete其中一些来释放一些记忆.(我知道那时我将永远不再需要尖头MyClass物体了.)我怎么能这样做?
我想你不能只delete()用我得到的原始指针调用get().
我见过一个函数get_deleter(shared_ptr<T> const & p)中boost::shared_ptr,但我不知道如何使用它,并且还表示,实验就在旁边.(我想我有1.38升.)
也许只是boost::shared_ptr为变量分配一个新的空?这应该扔掉旧值并删除它.
我遇到了关于词典内存管理的问题,提到了实习功能.它究竟做了什么,何时使用?
举个例子:
如果我有一组称为看出,包含形式的元组(字符串1,字符串),我用它来检查重复,会存储(实习生(字符串1),实习生(字符串2))提高性能WRT内存或速度?
我环顾四周,但一直无法找到解决问题的问题.这是我的代码:
#include <stdlib.h>
struct my_struct {
int n;
char s[]
};
int main()
{
struct my_struct ms;
ms.s = malloc(sizeof(char*)*50);
}
Run Code Online (Sandbox Code Playgroud)
这里是错误gcc给我的:错误:无效使用灵活的数组成员
如果我在结构中声明s的声明,我可以编译它
char* s
Run Code Online (Sandbox Code Playgroud)
这可能是一个优秀的实现(指针算法比数组快,是吗?)但我想在ca声明中
char s[]
Run Code Online (Sandbox Code Playgroud)
是相同的
char* s
Run Code Online (Sandbox Code Playgroud) c++ ×2
java ×2
memory ×2
string ×2
.net ×1
arrays ×1
boost ×1
c ×1
delphi ×1
dom ×1
fastmm ×1
html5 ×1
javascript ×1
jquery ×1
malloc ×1
memory-leaks ×1
optimization ×1
performance ×1
pointers ×1
python ×1
python-3.x ×1
shared-ptr ×1
struct ×1