获取内存_让我们来调试 iOS 内存 Memory Graph

感谢你阅读本文,如果你喜欢的话,欢迎关注「 iOS 成长指北 」,如果本文对你有所帮助,欢迎点赞、收藏、分享

小小文件,大大内容!

在学习 iOS 内存管理的过程中,除了使用 Instruments 中的 Allocations、Leaks之类的工具,我们还可以使用命令行工具来分析 .memgraph 文件。

今天我们主要介绍以下几种命令行分析工具 vmmap、leaks、heap、malloc_history

获取 Memory Graph 文件

当我们的应用程序运行一段时间后,我们可以通过以下方式来获取一个具有相当数据的 .memgraph 文件。

首选,在运行 APP 过程中,打开  Memory Graph,选择 View Memory Graph Hierarchy

bccc3dc18d98d2059b3d85000e071147.png

然后,生成完 Memory Graph 以后,点击 File -> Export Memory graph 导出 一个 .memgraph 文件

957829e85277c19780031375be1f3cb3.png

一旦导出了 .memgraph 文件。我们可以使用命令行工具(如 vmmapleaksheapmalloc history)进一步研究它。

vmmap

在 从 OOM 到 iOS 内存详解 一文中,我们简单介绍了使用 vmmap 命令行工具获取 .memgraph 文件的总结信息。

vmmap -summary a.memgraph

使用 -summary 获取当前 a.memgraph 文件的概览。

96ef80127ddb33ca26e604b35a76e8bb.png

介绍报文中一些需要关注的类型:

  • __TEXT 代码段,只读,包含函数,和只读的字符串

  • __DATA 数据段,读写,包括可读写的全局变量等

  • __LINKEDIT 包含了方法和变量的元数据(位置,偏移量),以及代码签名等信息

  • __OBJC   如果应用程序包含 Objective-C 代码,则此区域包含 Objective-C 运行时库代码

  • Shared Memory 与其他应用程序之间共享的系统库(例如 Cocoa 和 OpenGL)

  • Mapped file 该区域包含经常被访问的文件内容,并映射到虚拟内存以支持更快的访问

  • Stack 包含栈存储器,包括每个函数调用的参数

__TEXT__DATA__LINKEDIT 这三个都对应 Mach-O File 的对应字段。关于更多 Mach-O 文件的分析,参照笔者的 深入理解 iOS 启动流程和优化技巧 - mach-O

vmmap --verbose

我们在 .memgraph 文件概览中只看到 Stack 大小, 我们在内存管理分配时所说的 Heap 存储,从哪里看到呢?

我们在这里先简单说明一下 OS X / iOS 的分配基础。

OS X 的 Heap 内存分配存在一种可拓展的机制。通过这种机制内存分配根据大小分为 3 种类型(Tiny,Small,Large)。我们后面可能详细说明一下这种机制,用来解释一下我们应该怎么在内存中分配一个大的内存或者多个连续或不连续内存。

.memgraph 文件 中我们可以查看 MALLOC_LARGEMALLOC_SMALL 和 MALLOC_TINY 这三个来了解 Heap的分配。

可以使用这个命令来查看

vmmap --verbose test.memgraph | grep "MALLOC_TINY"

8f281f6f97a01fd506cba2dc8f86f81b.png

获取 Dirty Memory 页数

使用下述获取方法获取内存中Dirty Memory 的页数

vmmap -pages test.memgraph | grep '.dylib' | awk '{ sum += $6} END { print "Total Dirty Pages:" sum } '

3a26b8130eb857b086c1ef2bc17446b3.png

LEAKS

显示已分配但不再引用的对象,并显示泄漏所属的引用循环。

leaks a.memgraph

使用 leaks test.memgraph 获取 leaks 的分析结果

cb2a9b7490d3865fc3958adefe3c6de1.png

打开 malloc 日志堆栈

建议开启 malloc 日志堆栈,从而获取到根节点的回溯。

在运营应用程序之前  Edit Scheme -> Run -> Diagnostics

dd76852269136a077cbebaf05d7c5fa4.png

使用 leaks test.memgraph 获取对应的描述信息

3c877a186215c74bc717bedbf911d363.png

如何查询

通过命令打印的信息比较多,很容易被命令行工具进行截取,并且当我们想要对对某些内存进行深究时,往往需要花费很长的时间。

leaks -helper 获取 leaks 工具支持的方法

9aa84fa1b47c8ba44696c04c9ac951e9.png

然后感觉 --trace 或 --traceTree 命令有所帮助

83d1d6e88f0927bdf725d5d15f74c309.png

Heap

显示分配在进程堆上的对象,这些对象用于标识内存中的大的对象及其分配的对象。

heap -sortBySize a.memgraph

使用 heap -sortBySize a.memgraph 获取按照大小逆序排列的所有分配在堆中的对象

82a9a51e400afa2ba77a808d294ab14d.png

使用  heap 命令可以使你对分配的对象一目了然。

实践价值

如果我们的项目工程里使用了大量的自定义名称的类名,我们可以通过使用 heap 命令来获取当前分类所创建的超过某个代码限制的类

通过下面的命令可以获取到当前有多少超过 100 字节以上的对象地址。

heap --addresses=UIImage[100-] test.memgraph

e4a65950e2a87978c2d459cbafd81399.png

一个过大的内存创建意味着可能有些问题。如果我们自定义的类占据了过多的内存和创建过多次数,可能意味着有些问题

除了运行过程中的内存分配,如果我们在首屏加载完成以后,立马导出我们的 .memgraph 文件,会不会有助于我们分析有哪些类在不必要的时候创建了?

MALLOC_HISTORY

对待已经开启 malloc 日志堆栈所生成的.memgraph 文件,我们可以通过使用 malloc_history 命令来做点有趣的事情。

前文说过,打开 malloc 日志堆栈 有助于我们进行回溯。当我们对一个地址心存疑惑,或者想知道他是什么时候创建的, 使用这个命令为内存中的给定地址提供回溯,从回溯中,可以识别并更好地管理导致大量内存分配的函数/类。

c044891cb27627aa1e1b11b6758d4bae.png

总结

在实际项目中,我们如何取舍这种分析方法呢?

内存创建(Creation)引用(Reference)具体大小(Size)
malloc_historyleaksvmmap, heap

当我们需要进一步了解如何介绍内存占用时,可以尝试使用上述工具

Use memory graphs to further understand and reduce memory footprint

参考文档

iOS — Advanced Memory Debugging to the Masses

iOS Memory Deep Dive


文章每周持续更新,欢迎关注「 iOS 成长指北 」第一时间阅读催更。一起学习,获得成长。如果本文对你有所帮助,欢迎点赞、分享、收藏

【Xcode应用】iOS性能分析 性能分析工具 腾讯PerfDog 包大小 设置输出Link Map文件:Xcode – Build Settings – Write Link Map File为YES 编译后可在如下位置找到该文件。 $(TARGET_TEMP_DIR)/$(PRODUCT_NAME)-LinkMap-$(CURRENT_VARIANT)-$(CURRENT_ARCH).txt 下载Link Map分析工具: ... 阅读详情

相关推荐

深入解析iOS内存泄漏:Instruments Leaks实战指南

本文深入解析了iOS应用开发中常见的内存泄漏问题,并提供了使用Instruments Leaks工具进行实战检测的完整指南。文章从内存泄漏的危害讲起,详细介绍了Leaks工具的启动、核心功能Call Tree的解读与设置技巧,并针对无法定位代码等疑难问题给出了解决方案。最后,通过剖析循环引用、未移除观察者等典型泄漏场景,帮助开发者掌握高效排查与修复内存泄漏的方法,从而提升应用稳定性与性能。

weixin_28836875的博客 274

使用Xcode的memory graph查找内存泄漏

由donnywals于2019年12月9日发布 代码无法充分发挥功能的原因很多。 在一篇文章中,我向您展示了如何使用Time Profiler来测量代码中每种方法所花费的时间,以及如何分析结果。 尽管可以使用这些工具发现,分析和修复许多与性能相关的问题,但通常必须对调试内存使用情况进行一些稍有不同的调试。 特别是与内存泄漏有关。 在今天的帖子中,我将向您展示如何使用Xcode中的Memory Graph工具来分析应用程序内存中保留的对象,以及如何使用此工具发现内存泄漏。 今天,我将特别关注保留周期。

互动教程网[www.hdjc8.com] 4684

MemoryGraph:构建应用程序的内存

内存图 该应用程序将为其运行的应用程序构建一个内存图。 最终图形表示各种类型的对象之间的关系。 局限性 当前版本不支持macOS应用和纯Swift对象 适用于iOS SDK 14.4和更低版本,并且不能保证其他SDK版本不会影响应用程序的稳定性 NSMallocBlocks对象未在图中表示 资源 其中一些方法来自但不限于以下来源: 一组用于iOS开发的应用程序内调试和探索工具 -苹果(C ++)开源堆查找实现 说明如何验证任意指针是否是有效的Objective-C对象 引擎盖下的类中的 对iOS for arm64上isa字段更改的说明 剖析macOS系统 的书

Memory Graph × Knowledge Memory:图谱构建与演化机制设计

随着智能体交互频次与任务复杂度的增长,原始向量记忆结构面临「片段多、上下文弱、冗余多、知识断裂」等问题。本篇将引入语义图谱的思想,构建具备 **节点化、关联性、可演化、可压缩** 特征的记忆结构 —— `MemoryGraph`。我们将系统设计节点构造逻辑、图谱生成流程、关系归因方式、演化规则与图谱化生成引擎,为构建“知识网络型智能体”奠定长期结构化记忆能力。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1835

分析字节跳动解决OOM的在线Memory Graph技术实现

之前看到字节团队分享的 “iOS性能优化实践:头条抖音如何实现OOM崩溃率下降50%+”这篇文章,对其实现比较感兴趣,但是没有开源,所以觉得自己花时间探索一下具体实现。 什么是OOM,为什么会发生OOM以及其原因分析,大家去看原文就好了,本文主要分析APP内存使用到达阈值后,如何采集Memory Graph信息并分析。 什么是Memory Graph? 这个时候就进入了断点模式,可以查看issue面板,注意选择右边Runtime: 有很多叹号说明就有问题了。看内存中object的名字,有.

原来是泽镜的博客 3146

SwiftDate内存泄漏终极解决方案:Xcode Memory Graph实战调试指南

SwiftDate作为Swift生态中功能强大的日期时间处理工具包,在开发过程中偶尔会遇到内存泄漏问题。本文将为你提供完整的SwiftDate内存泄漏检测和修复指南,帮助你构建更加稳定高效的应用程序。🚀 SwiftDate提供了丰富的日期解析、验证、操作、比较和显示功能,但在复杂的时间周期操作和区域转换中,如果不注意内存管理,可能会导致内存泄漏。 ## 理解SwiftDate内存管理机制

gitblog_00069的博客 1057

iOS-Tips调试宝典:快速定位内存泄漏的5种方法

iOS应用开发中,内存泄漏是导致应用崩溃和性能下降的常见问题。iOS-Tips项目为我们提供了丰富的调试技巧和工具使用方法,帮助开发者快速定位和解决内存泄漏问题。本文将介绍5种实用的内存泄漏检测方法,结合iOS-Tips中的实际案例,让您轻松掌握iOS调试的核心技能。😊 ## 为什么内存泄漏如此重要? 内存泄漏会导致应用占用内存不断增加,最终可能引发应用崩溃或被系统强制终止。在iOS开发中,

gitblog_00680的博客 825

iOS内存优化实战:使用DeallocationChecker快速解决ViewController泄漏问题

iOS开发中,内存泄漏是导致应用性能下降和崩溃的常见问题,尤其是ViewController的泄漏更是难以察觉。DeallocationChecker作为一款轻量级工具,能够帮助开发者在不打开Instruments的情况下快速检测ViewController泄漏,显著提升开发效率和应用质量。 ## 为什么ViewController泄漏如此棘手? ViewController作为iOS应用的

gitblog_01168的博客 1067

iOSiOS内存泄露总结(面试必备)

本文总结了iOS开发中常见的内存泄漏问题及解决方案。主要内容包括:循环引用、闭包强引用self、Timer/CADisplayLink/GCD导致的强引用、NSNotificationCenter未移除监听、WebView未清理缓存与delegate、单例或缓存强引用对象等常见内存泄漏场景。文章还介绍了使用Xcode Instruments、Debug Memory Graph等工具排查内存泄漏的方法,并推荐了FBRetainCycleDetector等辅助检测工具。最后提供了作者的官网、博客和GitHub

ZFJ_张福杰 744

iOSKeyPointExploration内存管理:彻底解决内存泄漏的实战技巧

iOSKeyPointExploration是一个专注于iOS开发关键技术点的开源项目,涵盖GCD系列、Operation、内存管理、Block、核心动画等多个重要领域。本文将聚焦内存管理这一核心主题,通过实战案例分享彻底解决内存泄漏的实用技巧,帮助开发者提升应用性能和稳定性。 ## 内存泄漏的常见"陷阱"与识别方法 🕳️ 在iOS开发中,内存泄漏是最常见也最容易被忽视的问题之一。它不仅会导

gitblog_00453的博客 734

使用火山引擎 APMPlus 优化 iOS 内存性能的全套指南

本文面向 iOS 研发,不会涉及复杂的底层原理,而是直接告诉 iOS 研发答案,即怎么做,只需要花半小时阅读本文,就可以在开发需求的时候,知道如何更好利用内存来提升用户体验,同时避免稳定性相关问题给业务带来负向的用户体验;同时本文作者的初心是希望这篇文章能成为研发同学的一个“字典”,在一些特定场景或者感觉可能会踩内存坑的时候可以翻阅,快速找到最佳的编码规范。

字节跳动云原生计算官方账号 1592

如何3分钟集成DeallocationChecker?iOS开发者必备的内存泄漏检测神器

🚀 作为一名iOS开发者,你是否经常为内存泄漏问题头疼?特别是ViewController的内存泄漏,往往难以发现却严重影响应用性能。今天我要向你介绍一款**终极内存泄漏检测神器**——DeallocationChecker,它能让你在3分钟内快速集成,轻松发现ViewController的内存泄漏问题! ## 🔍 DeallocationChecker是什么? **Deallocatio

gitblog_00443的博客 378

翻译: 如何使用 Xcode 的内存调试器检测 iOS 内存泄漏并保留周期

在 DoorDash,我们一直在努力通过提高应用程序的稳定性来提高我们的用户体验。这项工作的主要部分是防止、修复和消除我们大型代码库中的任何保留周期和内存泄漏。为了检测和修复这些问题,我们发现 Memory Graph Debugger 快速且易于使用。在我们的 Dasher iOS 应用程序上显着提高了我们的无 OOM 会话率之后,我们想分享一些关于避免和修复保留周期的技巧,以及使用 Xcode 的内存调试器的快速介绍,供不熟悉的人使用。 如果您对查明问题内存的根本原因感兴趣,请查看我们的新博客文章使用

AI架构师易筋 4748

终极指南:快速解决react-native-maps iOS EXC_BAD_ACCESS崩溃与调试技巧 [特殊字符]

React Native Maps 是移动应用开发中最受欢迎的地图组件库之一,它为iOS和Android提供了强大的地图功能。然而,许多开发者在iOS平台上使用react-native-maps时,经常会遇到令人头疼的EXC_BAD_ACCESS崩溃问题。😫 本文将为您提供完整的解决方案和调试技巧,帮助您快速定位并解决这些崩溃问题。 ## 什么是EXC_BAD_ACCESS崩溃?🔍 EXC

gitblog_01123的博客 1127

Maestro Auto Run深度解析:如何用AI Agent批量处理Markdown任务清单

Maestro 是一款 AI Agent 编排指挥中心桌面应用,其 Auto Run 功能可以将一份份 Markdown 任务清单交给 AI Agent 自动批量执行:每个任务都在全新会话中独立运行,逐个打勾、逐个完成,支持无人值守长达数十小时的连续运行。本文带你快速上手 Maestro Auto Run,从写清单、批量执行到 Playbook 复用,一次讲透。 ## 一、Auto Run 是什

gitblog_00435的博客 868

ios 重复引用 静态库_iOS调试Block引用对象无法被释放的一个小技巧

作者 | 欧阳大哥2013Block技术在iOS开发中非常流行也很方便,但是稍微疏忽就可能会产生引用无法被释放的问题,从而造成内存泄漏。那如何知道哪个Block持有了对象并造成内存泄漏呢?一个解决的方法是在程序运行时通过Xcode的Debug Memory Graph 来查看当前进程中所有生命周期内的对象。这样可以在调试时通过这个功能发现一些本来应该被释放但是却没有被释放的对象。从而确定...

weixin_30837611的博客 349

debug memory release on ios

source link:http://www.cocoadev.com/index.pl?DebuggingAutorelease Update: For Leopard users, I recommend using Instruments: http://www.corbinstreehouse.com/blog/index.php/2007/10/instruments-on-leo

726

iOS内存调试的3种方法以及步骤

下面使用的是Xcode 8.3.3,iOS 10.3 一、使用Analyze分析 Xcode -> Product -> Analyze 即可进行静态分析。 二、使用Debug Memory Graph调试 1、开启Malloc stack logging 2、在Xcode下面选择Debug Memory Graph 3、如下图所示进行操作,链接到有问题的代码 也可以通过下面...

weixin_34279246的博客 195
上一篇: 额外参数_0.68M参数,71 fps,轻量级实时语义分割网络LRNNet
下一篇: vs中运行c++为啥run task不可以用了_如何使用 C# 在异步代码中处理异常
故乡故乡
博客等级 码龄8年 29粉丝 343原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值