问题标签 [nedmalloc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
435 浏览

c - nedmalloc:mem>=fm 是从哪里来的?

在我的应用程序中实现 nedmalloc 时,我经常遇到 nedmalloc 拒绝释放一块内存并声称它没有分配它的情况。

我正在使用 v1.06beta1_svn1151 版本。

在调试时,我发现一个特定的条件失败了,所有其他的(包括幻数)都成功了。条件是这样的:

在 Win32 上,这似乎等同于:

这似乎与以下内容相同:

就我而言,我真的看到了 mem < fm. 我现在不明白的是,这种情况从何而来。我在代码中的任何地方都找不到任何可以保证 fm <= m 的东西。然而,“选择没有被破坏”:我怀疑它真的是 nedmalloc 中的一个错误,很可能我在某处做错了什么,但我找不到它。一旦我打开 nedmalloc 的调试功能,问题就消失了。

如果这里有人了解 nedmalloc 的内部工作,您能否向我解释为什么 fm <= mem 有保证?

0 投票
4 回答
1973 浏览

c++ - Boost::Mutex & Malloc

我正在尝试在 C++ 中使用更快的内存分配器。由于许可/成本,我无法使用 Hoard。我在单线程设置中使用 NEDMalloc 并获得了出色的性能,但我想知道是否应该切换到其他东西——据我了解,NEDMalloc 只是基于 C 的 malloc() 和 free() 的替代品,不是基于 C++ 的 new & delete 运算符(我广泛使用)。

问题是我现在需要是线程安全的,所以我试图 malloc 一个引用计数的对象(以防止过度复制),但它也包含一个互斥指针。这样,如果您要删除最后一个副本,您首先需要锁定指针,然后释放对象,最后解锁并释放互斥锁。

但是,使用 malloc 创建 boost::mutex 似乎是不可能的,因为我无法将私有对象初始化为直接调用构造函数。

所以我遇到了这种奇怪的情况,我使用 new 分配锁,使用 nedmalloc 分配其他所有内容。但是当我分配大量内存时,我遇到了分配错误(当我切换到 malloc 而不是 nedmalloc 时消失了〜但性能很糟糕)。我的猜测是,这是由于内存碎片以及 nedmalloc 和 new 无法并排放置 nice 造成的。

必须有更好的解决方案。你有什么建议?

0 投票
2 回答
3807 浏览

windows - Windows 内存分配问题

我目前正在研究malloc()Windows 下的实现。但在我的研究中,我偶然发现了令我困惑的事情:

首先,我知道在 API 级别,Windows 主要使用HeapAlloc()andVirtualAlloc()调用来分配内存。我从这里收集到malloc()(包含在 CRT 中的 C 运行时)的 Microsoft 实现基本上要求HeapAlloc()块 > 480 字节,否则管理分配给小分配的特殊区域VirtualAlloc(),以防止碎片。

好吧,这一切都很好。但还有其他实现malloc(),例如nedmalloc,声称比微软的malloc.

这一切让我想知道一些事情:

  1. 为什么我们不能只调用HeapAlloc()小块?是否在碎片方面表现不佳(例如通过“首次拟合”而不是“最佳拟合”)?

    • 实际上,有什么方法可以知道各种 API 分配调用的幕后情况吗?那会很有帮助。
  2. 是什么让nedmalloc微软的速度如此之快malloc

  3. 从上面我得到的印象是HeapAlloc()/太慢了,以至于偶尔调用它们然后自己管理分配的内存VirtualAlloc()要快得多。malloc()这个假设是真的吗?还是malloc()因为碎片化而只需要“包装器”?人们会认为像这样的系统调用会很快——或者至少会考虑一些想法来提高它们的效率。

    • 如果是真的,为什么会这样?
  4. malloc平均而言,一个典型的调用(可能是已分配段数的函数)执行了多少(一个数量级)内存读/写?我会直观地说这是一个平均程序的几十个,对吗?

0 投票
1 回答
85 浏览

c - 铅在使用 nedflush 处理内存泄漏

我尝试使用 nedmalloc 的调试功能在我的代码中查找潜在的内存泄漏。所以我激活了标志ENABLE_LOGGINGNEDMALLOC_TESTLOGENTRY.

在我的程序中,我只使用系统内存池。在我的程序的最后,我调用该函数neddestroysyspool以刷新所有内存事件。

首先,我无法激活堆栈跟踪功能。当我改变这个深度时,程序在几次分配后崩溃。为了在 VS2010 下编译,我必须DeinitSym通过调用来定义自己CloseHandle;我希望我做得对……但它不能正常工作。所以我不使用它。

所以我只解析文件nedmalloc.csv:我对它进行排序,这要归功于地址、分配的大小和减去地址中释放的大小。由于未知原因,对于几个大块(大小> 400kb),分配时给出的大小是正确的,但空闲时给出的大小不同,高于分配的大小。例如,我分配了一个 840352 字节的块,但释放时,记录的大小为 851932 字节。是正常的吗?

有人对这个问题有一些答案或提示吗?