诊断 Mac OS X 上的堆碎片?

2024-04-27

我正在编写的核心基础应用程序似乎消耗的内存比我实际分配的内存多(根据活动监视器中的“真实内存”计数)。

我已通过 Instruments 中的“实时字节分配”视图确认我的实际分配符合我的预期(大约 10MB),但活动监视器中的“真实内存”计数显示 > 60MB 并且明显在增长。我还使用仪器确认没有泄漏。

我的应用程序保留了一个大小不同的缓冲区的大队列,并且在添加/删除队列项时不断地 free()-ing 和 malloc()-ing 缓冲区。

阅读了一些有关堆碎片的内容后,这似乎是对正在发生的事情的可能解释。所以我的问题如下:

  1. 有什么方法可以在 OS X 上确认这一点,例如也许可以获得堆的直观表示?
  2. OS X 是否有与 Windows 一样的可选低碎片堆管理器?

对于任何想要复制该问题的人来说,以下示例代码很好地显示了相同的症状:

#define MAX_SIZE (10*1024*1024)

int main (int argc, const char * argv[])
{

size_t actual_alloc=0;
size_t max_alloc=0;

char *bigbuf=NULL;
size_t bigsize=0;

for  (long x=0; x<10000000; x++)
{
    if (bigbuf!=NULL)
    {
        actual_alloc -= bigsize;
        free(bigbuf);
    }

    bigsize = rand() % MAX_SIZE; // alloc random amount up to MAX_SIZE
    bigbuf = (char*)malloc(bigsize);
    memset(bigbuf, 'x', bigsize);
    actual_alloc += bigsize;

    if (actual_alloc > max_alloc)
        max_alloc = actual_alloc;

    if (x%100==0)
    {
        printf("alloc = %u \t max = %u\n", 
             (unsigned long)actual_alloc, (unsigned long)max_alloc);

        // max_alloc tends towards 10MB, 
        //  "Real Mem" in activity monitor tends towards 60MB
    }
}


return 0;
}

如果从上面的代码中删除随机元素,您将获得大约 10MB 的进程内存使用量(如预期)。


堆是一个复杂的数据结构,你所看到的是正常的。仅仅因为您 free() 缓冲区并不意味着库正在将该内存返回给操作系统。系统调用是有成本的,因此当分配系统请求一块内存时,它往往会请求超出其需要的内存,以便后续分配可以返回内存而无需进入内核。堆还可能为不同的分配大小维护多个分配区域,以避免长时间搜索和碎片。通过分配随机大小,您已经成功初始化了其中几个存储桶。

您无法预测内存分配子系统或链接的其他系统库的行为,因此活动监视器或 top 或任何其他工具不会为您提供有意义的信息。如果要跟踪内存分配或泄漏,请使用 malloc 调试器或 valgrind 等工具。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

诊断 Mac OS X 上的堆碎片? 的相关文章

  • 将 Stream 反序列化为 List 或任何其他类型

    尝试将流反序列化为List
  • 将图像文件从网址复制到本地文件夹?

    我有该图像的网址 例如 http testsite com web abc jpg http testsite com web abc jpg 我想将该 URL 复制到 c images 中的本地文件夹中 而且当我将该文件复制到文件夹中时
  • 在Application_AquireRequestState事件中用POST数据重写Url

    我有一个在其中注册路线的代码Application AcquireRequestState应用程序的事件 注册路由后 我会在 Http 运行时缓存中设置一个标志 这样我就不会再次执行路由注册代码 在此事件中注册路线有特定原因Applicat
  • 访问“if”语句之外的变量

    我怎样才能使insuranceCost以外可用if陈述 if this comboBox5 Text Third Party Fire and Theft double insuranceCost 1 在 if 语句之外定义它 double
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • 是否有像 gccxml 这样的用于生成包装器的 C 标头解析器工具?

    我需要为一种新的编程语言编写一些 C 标头包装器 并且想要类似 gccxml 的东西 但不完全依赖 gcc 以及它在 Windows 系统上带来的问题 只需要读C而不是C 只要有完整的文档记录 任何格式的输出都可以 Linux Solari
  • 存储过程上的 OdbcCommand - 输出参数上出现“未提供参数”错误

    我正在尝试执行存储过程 通过 ODBC 驱动程序针对 SQL Server 2005 但收到以下错误 过程或函数 GetNodeID 需要参数 ID 但未提供该参数 ID 是我的过程的 OUTPUT 参数 在存储过程中指定了一个输入 mac
  • 序列化和反序列化 Visual Studio 解决方案文件 - 或以编程方式编辑?

    我想以编程方式添加和删除项目 解决方案文件夹和其他项目 例如解决方案的资源文件 但我不确定最好的方法是什么 对于那些不知道的人 高度简化 解决方案文件 sln 通常如下所示 Microsoft Visual Studio Solution
  • 单线程公寓问题

    从我的主窗体中 我调用以下命令来打开一个新窗体 MyForm sth new MyForm sth show 一切都很好 但是这个表单有一个组合框 当我将其 AutoCompleteMode 切换为建议和追加时 我在显示表单时遇到了这个异常
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • 操纵 setter 以避免 null

    通常我们有 public string code get set 如果最终有人将代码设置为 null 我需要避免空引用异常 我尝试这个想法 有什么帮助吗 public string code get set if code null cod
  • 格式化货币

    在下面的示例中 逗号是小数点分隔符 我有这个 125456 89 我想要这个 125 456 89 其他示例 23456789 89 gt 23 456 789 89 Thanks 看看这个例子 double value 12345 678
  • 在简单注入器中注册具有多个构造函数和字符串依赖项的类型

    我正在尝试弄清楚如何使用 Simple Injector 我在项目中使用了它 注册简单服务及其组件没有任何问题 但是 当组件具有两个以上实现接口的构造函数时 我想使用依赖注入器 public DAL IDAL private Logger
  • 在VisualStudio DTE中,如何获取ActiveDocument的内容?

    我正在 VisualStudio 中编写脚本 并尝试获取当前 ActiveDocument 的内容 这是我当前的解决方案 var visualStudio new API VisualStudio 2010 var vsDTE visual
  • 正确使用“extern”关键字

    有一些来源 书籍 在线材料 解释了extern如下 extern int i declaration has extern int i 1 definition specified by the absence of extern 并且有支
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • 如何将对象转换为传递给函数的类型?

    这不会编译 但我想做的只是将对象转换为传递给函数的 t public void My Func Object input Type t t object ab TypeDescriptor GetConverter t ConvertFro
  • C++ [Windows] 可执行文件所在文件夹的路径[重复]

    这个问题在这里已经有答案了 我需要访问一些文件fstream在我的 Windows 上的 C 应用程序中 这些文件都位于我的exe文件所在文件夹的子文件夹中 获取当前可执行文件的文件夹路径的最简单且更重要的 最安全的方法是什么 Use 获取
  • 启动画面后主窗口出现在其他窗口后面

    我有一个带有启动屏幕的 Windows 窗体应用程序 当我运行该应用程序时 启动屏幕显示正常 消失并加载应用程序的主窗体 但是 当我加载主窗体时 它出现在包含该应用程序的 Windows 资源管理器目录下 这是运行启动画面然后运行主窗体的代
  • c# 模拟 IFormFile CopyToAsync() 方法

    我正在对一个异步函数进行单元测试 该函数将 IFormFile 列表转换为我自己的任意数据库文件类列表 将文件数据转换为字节数组的方法是 internal async Task

随机推荐

  • 在 jupyter 中找不到 Tensorboard 作为魔法函数

    我想使用最新的tensorflow 2 0 0a0在jupyter中运行tensorboard 使用tensorboard版本1 13 1和python 3 6 using tensorboard logdir logs base dir
  • 捕获 Exchange 命令行管理程序中的错误

    我正在尝试编写一个创建 Exchange 邮箱的 powershell 脚本 只要邮箱尚不存在 这种方法就可以正常工作 但是当我尝试捕获任何错误并将其报告回来时 脚本就会运行 就好像一切都很好一样 我在现有用户上运行该脚本 它显示了错误 但
  • 从 NetBeans 在 tomcat 上部署应用程序时出现 HTTP 错误 503?

    我更新了NetBeans我的 MacBook 上从 7 3 升级到 7 4 更新之前一切正常 但是安装之后NetBeans7 4 当我尝试在tomcat 它给了我以下错误 ant f Volumes DEVELOPMENT Projects
  • Clipboard.GetData() 在不应返回 null 时返回 null

    我正在将 Excel 文档中的单元格复制到剪贴板 以便它们可以作为图像插入到其他地方 单元格可以很好地复制到剪贴板 因为我可以在代码运行后手动粘贴图像 但是我无法获取数据 这是我的代码 tempWorkSheet Range tempWor
  • 如何将“-ddump-minimal-imports”与堆栈一起使用

    我是 stack 的忠实粉丝 我已经从我的机器中完全删除了任何独立的 cabal 和 ghc 可执行文件 让 stack 在它自己神秘的 stack 目录中安装它需要的任何东西 但是 看起来有些标志在堆栈下无法正常工作 例如 我想使用 dd
  • 在 Pandas 中使用多重索引时显示所有索引值

    我希望在查看我的 DataFrame 时 我将看到 multiIndex 的所有值 包括当后续行对于其中一个级别具有相同索引时 这是一个例子 arrays 20 50 20 20 N A N A 10 30 tuples list zip
  • Excel VBA 中的 TypeName 返回什么?

    我想检查一下数据类型 Cells 2 1 Value即 这里有什么 以下 我尝试了名称 整数 长整型等 但似乎不接受 If TypeName Cells r 1 Value WHAT GOES HERE Then MsgBox Yes El
  • 多列条件计数 SQL

    我正在尝试计算连续 4 个单独列中的不同条目 然后对结果求和 例如 表头看起来类似于 ID Col1 Col2 Col3 Col4 每列 保存 ID 可以有一个文本值 W X Y 或 Z 列可以有相同的值 我想做的是找出一种方法来计算列中的
  • Java OS X Lion 关于菜单

    我正在尝试覆盖 OS X Lion 上的 Java 应用程序或 Leopard 及以上版本中的任何内容中的 关于 菜单 我怎么做 到目前为止 我读过的教程似乎不是最新的 一些类不再在 Java Mac SDK 中 其他类的事件也没有被触发
  • numpy 中 Float16 比 Float32 和 Float64 慢得多[重复]

    这个问题在这里已经有答案了 我试图运行一个代码片段 看起来像 import numpy as np import time def estimate mutual info X neurons bins 5 xy np histogram2
  • 将json文件插入mongodb

    我是 MongoDB 新手 在 Windows 中安装 MongoDB 后 我尝试使用以下命令插入一个简单的 json 文件 C gt mongodb bin mongoimport db test collection docs lt e
  • 如何将 Windows 窗体控件设置为只读?

    时隔很长一段时间回到VS2008中的WinForms 修补VS2008 Express版中的一个OOD问题 我需要一些控件作为 仅显示 小部件 用户不应该能够更改这些控件的值 小部件通过定期更新刻度事件进行更新 我依稀记得有一个 ReadO
  • 通过列表搜索

    我一直在尝试定义一个函数 给定一个整数列表和一个整数 n 返回一个布尔值 指示 n 是否在列表中恰好出现一次 我有这个 但它不起作用 我无法弄清楚 once a gt a gt Bool gt Bool filter filter p x
  • 如何填充剩余高度的100%?

    1 2
  • 列出 git 标签名称、日期和消息

    如何列出所有标签的标签名称 标签日期和标签消息 看来 git 通过以下方式分离了提交的显示逻辑git log并通过标签git tag使得列出标签名称 标签日期和标签消息变得困难 我可以显示标签日期 姓名和提交消息 using git log
  • bcrypt 中的盐的要点

    抱歉 如果这是一个愚蠢的问题 我只是想知道 bcrypt 中的盐有什么意义 我的意思是 如果您有以下用于从密码创建哈希的代码 function generateSalt salt 2a 13 salt salt 11111111111111
  • iOS 在应用程序内注册推送通知

    Q1 我必须在应用程序启动时执行此操作吗 或者我可以在应用程序中的任何时候触发允许 不允许的提示吗 Q2 有没有办法查明用户是否单击了是 否 打回来 Q3 如果用户已经单击 否 在之前的会话中 我的提示实际上会触发吗 或者我是否需要告诉用户
  • “sed” 在文件中插入反斜杠

    Tool Windows 版 Git Bash Problem 尝试在目录中每个文件的顶部插入文本 connectcentral Code for f in DIR sql do sed i 1i connect central f don
  • iPhone:跳转到uitableview中的下一个uitextfield,如何?

    在我的 iPhone 项目中 我使用 UITableview 和包含 UITextfields 的 UITableViewCells 我在许多应用程序中看到 可以使用下一个按钮跳转到下一个单元格中的下一个文本字段 实现这一目标的最佳方法是什
  • 诊断 Mac OS X 上的堆碎片?

    我正在编写的核心基础应用程序似乎消耗的内存比我实际分配的内存多 根据活动监视器中的 真实内存 计数 我已通过 Instruments 中的 实时字节分配 视图确认我的实际分配符合我的预期 大约 10MB 但活动监视器中的 真实内存 计数显示