主要记录下用于分析iOS/macOS 内存问题的笔记。
 主要分析命令: vmmap, leaks, malloc_history
一:前言
有 3 种思考方式
- 你想看到对象的创建吗?
- 你想要查看内存中引用对象或地址的内容吗?
- 或者你只是想看看 一个实例有多大?
如果你在进程启动时 启用了 malloc 堆栈日志记录, 那么 malloc_history 可以帮助你查找 该对象的回溯。
 如果你只是想看看 在内存中引用对象的内容。 你可以使用 leaks 和在内存页面中 提供的其他工具来帮助你 。
 最后 如果你只是想了解 一个区域或一个实例有多大 vmmap 和 heap 是首选工具 作为起始点。
 我建议在进程的 Memgraph 上 运行带有 -summary 命令的 vmmap 然后顺着线程继续进行.
二:准备
勾选Malloc Statck Logging ,这样 malloc_history 才有效果。
 
xcode 导出 .memgraph
 

三:命令
vmmap
- vmmap --summary app.memgraph
 - dirty size和- swapped size才是我们需要关注的内容
 - dirty size代表脏内存大小,我们app希望脏内存越小越好,最好都是clean内存
 - swapped sizeiOS 中代表 压缩的内存
 app 使用的总内存一般为 =- dirty size+- swapped size
  
- vmmap --page app.memgraph | grep '.dylib'
 对上面的内容只 看- '.dylib'动态库
  
leaks
- leaks app.memgraph命令查看无根内存,代表这不能被释放的无根内存(macOS适用)
- leaks -traceTree 0x000000014b9b4000 PlanetPics.memgraph

heap
- heap App.memgraph查看堆对象
- heap App.memgraph -sortBySize按分配的大小排序,找出内存最大的那个元素,比如- NSConcreteData
- heap App.megraph -addresses all | ‹classes-pattern>直接查找上一步- NSConcreteData的具体数据- heap App.megraph -addresses NSConcreteData
malloc_history
- malloc_history app.memgraph [address]找到上一步的有问题的其中一个地址,进行堆栈跟踪
 - leaks -traceTree 0x000000014b9b4000 PlanetPics.memgraph
- malloc_history PlanetPics.memgraph --fullStacks 0x000000014b9b4000
  
四: Xcode 查看内存泄露
双击app.memgraph 打开Xcode后,
 点击筛选可以单独查看内存泄露的内存
 
链接: https://developer.apple.com/wwdc18/416









![[数据结构]双向带头循环链表制作](https://img-blog.csdnimg.cn/direct/d7a3f2063c8d4caab458d44767556cd3.png)









