APMPlus中 MemoryGraph技术能力分享
如果无法正常显示,请先停止浏览器的去广告插件。
1. APMPlus中MemoryGraph技术能力分享
分享嘉宾:党鹏⻜
2. 01 02 03
APMPlus介绍 OOM剖析 MemoryGraph原理和
使用
3. 01
APMPlus介绍
4. iOS开发的前世今生
iPhone OS 1 第一个本地化iPhone
应用程序开发包 变更为iOS OS
iOS 4 - 6 今日头条 iOS 7 - 11 抖音 iOS 11以后 ⻜书
2007年1月9日 2007年10月17日 2010年 - 2013年 2012年3月 2013年-2017年 2016年9月 2017年 - 至今 2019年9月
至今
5. 应用性能管理方法论
开发环境
生产环境
6. 应用性能监控全链路版(APMPlus)
• 业务全链路
• 功能全链路
• 平台全链路
7. 业务全链路
8. 功能全链路
9. 平台全链路
• iOS
• Android
• Flutter
• Hybrid
• Web
• 服务端
• 小程序
• PC(即将上线)
10. APMPlus有什么优势?
• 全链路的APM
• 更稳定的APM
• 更低的接入成本:非侵入式SDK
• 更丰富的异常现场还原能力
• 更灵活的管理方式,以节省开支
• …
11. 02
OOM剖析
12. OOM是什么?
OOM(Out Of Memory)指的是应用因系统内存占用过高而被操作系统强制终止的崩溃
前台应用
前台应用
前台应用
后台应用B 后台应用B 后台应用A 后台应用A 后台应用A
系统占用 系统占用 系统占用
BOOM崩溃
前台应用
阈值
系统占用
BOOM崩溃
系统占用
FOOM崩溃
13. OOM的危害?
• 对重度用户更易产生影响
• 随着业务的迭代,OOM的量不容小觑
• 一些其它的副作用
14. OOM的解决方案?
• Xcode提供的Memory Graph功能
• Instruments相关的工具集
• Jetsam
• 一些开源库
15. OOM的特点
• 难调试
• 难复现
16. 03
MemoryGrap
原理和使用
17. iOS的内存模型
High
High
VM Region
内存块1
内存块2
内存块3
MMU
VM Region
CPU
内存块4
VM Region
Low
物理内存
struct vm_region_submap_info_64 {
…
unsigned int
user_tag;
…
};
判定user_tag
完整定义:vm_statistics.h文件
VM Region
Low
vm_region_recurse
vm_region_recurse64
虚拟内存
VM_MEMORY_STACK
栈空间
VM_MEMORY_MALLOC_xxx
由libmalloc声明的VM Region
其它类型
不做特殊处理
18. iOS的内存模型 - 栈空间
High
• 栈空间从高地址向低地址使用
• 通过SP来标记栈空间的使用情况
SP
task_threads
thread_get_state
Low
栈
19. iOS的内存模型 - 堆空间
High
VM Region
malloc_get_all_zones
VM Region
VM Region
VM Region
Low
虚拟内存
typedef struct _malloc_zone_t {
…
struct malloc_introspection_t *(introspect);
…
} malloc_zone_t;
20. MemoryGraph如何运行的?
• 挂起所有非采集线程
• 获取所有的内存节点
• 建立内存对象引用关系以及相应的辅
助信息
• 写入文件
• 恢复线程状态
21. MemoryGraph对象如何符号化
Object Pointer
object_getClass
Class
objc_copyClassList
__NSCFType
object_getClassName
CFGetTypeID
CFTypeID
CFCopyTypeIDDescription
ClassName
ClassName
22. MemoryGraph的引用树和支配树
User
Space
User
Space
1
Abandoned
1
Abandoned
2
2
3
3
4
5
4
6
5
6
7
引用树
7
支配树
23. MemoryGraph如何使用?
24. 我们来实操一下吧
Demo
25. MemoryGraph的效果怎么样?
• 头条、⻜书、抖音等OOM率都下降50%+
• 单次采集成功率可以达到99.5%
• 能够完整还原用户当时的内存状态
• 通过分析线上内存状态,量化大内存占用和内存泄露
• 通过节点符号和引用关系回答内存节点为什么存活这个问题
• 支持主要的编程语言,包括OC,C/C++,Swift等
26. MemoryGraph的性能和系统损耗怎么样?
27. 我们为MemoryGraph的性能,还做了哪些工作?
mmap
死锁检测
内存排序、二分查找
非法内存访问
非法内存过滤
性能方面
稳定性方面
28. 其它问题?
29. 感谢观看