飞书MemoryGraph实践分享
如果无法正常显示,请先停止浏览器的去广告插件。
1. ⻜书MemoryGraph实践分享
分享嘉宾:蔡亮
2. 在这里,你可以了解到
• ⻜书为什么选择APMPlus
• APMPlus效果与体验
• MemoryGraph实战
• MemoryGraph的一些经验
• APMPlus的其它收益
3. ⻜书是一款什么样的应用?
• ⻜书是字节跳动旗下先进企业协作与管
理平台
• 一站式整合及时沟通、智能日历、音视
频会议、⻜书文档、云盘等办公协作套
件,更提供OKR、招聘、绩效等组织管
理产品
• 作为企业协作与管理平台,业务复杂度
非常高,例如:千人视频等
4. ⻜书对APM的要求?
• 更低的接入成本(非侵入式SDK)
• 更全面、更高效的的异常探测手段
• 更丰富的异常现场还原能力
• 更灵活的采样方式,以节省开支
• 全面报警响应机制
• 多平台支持
• …
5. ⻜书为什么选择APMPlus?
• APMPlus全称“应用性能监控全链路版”,是火山引擎提供的针对应用服务的品质、性能以
及自定义埋点的APM服务
• 经过今日头条、抖音、⻜书等大型App的验证,能够保证SDK自身的稳定性,并提供更好
的异常探测手段和异常现场还原能力
• 提供全链路支持:App(iOS、Android)端、Web&小程序、服务端等
• 更低的接入成本:非侵入式SDK
• 提供全面报警响应机制
• …
6. ⻜书+APMPlus的效果与体验
OOM
不使用APMPlus 使用APMPlus
2‰ 0.8‰(降幅60%)
发现30例+
MemoryGraph
Crash+卡死
分析能力
3‰
1.5‰(降幅50%)
• 使用Xcode自带的分析工具,只 • 能够分析线上问题,贴近用户使
用场景;
能分析线下问题;
• 分析效率更高,降低分析成本;
• 分析成本较高;
7. MemoryGraph案例分析一
标题:Leaked Memory
产生原因:没有正确的管理内存,造成的OOM崩溃
适用场景:
• 侦测线上环境因内存泄露造成的OOM崩溃
• 可以作为debug环境的补充
8. - (void)dealloc {
[super dealloc];
if (!self.isLeaked) {
[self.largeObject release];
}
}
MemoryGraph案例分析一
BDLargeObject - (MRC)
BDLeakedObject
for (int index = 0; index < 5000; index++) {
BDLeakedObject *leakedObject =
[[BDLeakedObject alloc] initWithName:xxxxx];
if (0 != index && 0 == index % 100) {
sleep(1);
}
依赖
BDLargeObject *largeObject;
isLeaked = YES
- (instancetype)initWithName:
(NSString *)name;
BOOL isLeaked;
BDInnerLargeObject *largeObject;
-(instancetype)initWithLeakedObject:
(BOOL)isLeaked;
}
BDInnerLargeObject - (MRC)
long *_nums;
- (instancetype)init {
...
_nums = (long *)malloc(sizeof(long) * 1024 *
128);
...
}
9. 入口代码展示
BDLeakedObject展示
BDLargeObject展示
BDInnerLargeObject展示
日志 程序运行
事件开启
内存状态
Log日志
10. OOM案例分析一
MemoryGraph数据
11. MemoryGraph案例分析二
标题:AutoreleasePool
产生原因:没有及时倾倒AutoreleasePool中的对象,造成的OOM崩溃
适用场景:
• 侦测复杂业务的内存使用状态
12. - (void)dealloc {
[super dealloc];
if (!self.isLeaked) {
[self.largeObject release];
}
}
MemoryGraph案例分析一
BDLargeObject - (MRC)
BDAutoreleaseObject
for (int index = 0; index < 5000; index++) {
__autoreleasing BDAutoreleaseObject
*autoreleaseObject = [[BDAutoreleaseObject alloc]
initWithName:xxx];
依赖
BDLargeObject *largeObject;
isLeaked = NO
- (instancetype)initWithName:
(NSString *)name;
if (0 != index && 0 == index % 100) {
sleep(1);
}
BOOL isLeaked;
BDInnerLargeObject *largeObject;
-(instancetype)initWithLeakedObject:
(BOOL)isLeaked;
}
BDInnerLargeObject - (MRC)
long *_nums;
- (instancetype)init {
...
_nums = (long *)malloc(sizeof(long) * 1024 *
128);
...
}
13. OOM案例分析二
入口代码展示
BDLeakedObject展示
BDLargeObject展示
BDInnerLargeObject展示
日志
程序运行
事件开启
内存状态
Log日志+内存状态
14. MemoryGraph案例分析二
MemoryGraph数据
15. OOM案例分析三
标题:图片下载
产生原因:系统库的一些机制问题
适用场景:
• 侦测系统库和三方库的一些机制问题
16. MemoryGraph案例分析一
for (int index = 0; index < 500; index++) {
[BDImageDownload imageDownloadWithURL:[NSURL
URLWithString:xxxx] completion:^(BOOL isSuccess,
UIImage *image) {
NSLog(@"ImageDownload index = %d, result =
%@.", index, isSuccess ? @"YES" : @"NO");
}];
}
依赖
BDImageDownload
- (instancetype)initWithName:
(NSString *)name;
+ (void)imageDownloadWithURL:(NSURL *)url completion:
(ImageDownloadResultBlock)imageDownload {
dispatch_queue_t queue = dispatch_queue_create("com.bytedance.imageload",
DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
…
});
}
17. 入口代码展示
BDImageDownload展示
程序运行
事件开启
内存状态
Log日志+内存状态
18. OOM案例分析三
MemoryGraph数据
19. MemoryGraph的一些经验
• OOM的触发不一定是内存泄露,也有可能是对机制的使用不合理造成的
• MemoryGraph优先确认聚类列表中占用内存大的内存块
• MemoryGraph优先确认同类型数量比较大的内存块。在大型项目中,同类型对象理论个数
是可以达到20-30万的。超过这个量,就应该纳入重点排查对象中
• MemoryGraph中同类型的类,往往会存在两种状态,可以通过打标签的形式,快速找到类
没有泄露时的状态,方便排查问题
• …
20. APMPlus带来的其它收益
• 用户异常单点分析能力,通过内存异常、CPU异常、卡顿、磁盘、⻚面加载耗时等维度快
速发现用户使用App时的异常,并提供高效的解决方案;
• Crash分析能力,除了基础的异常堆栈分析外,还提供了寄存器和栈内存信息,并基于
Alog日志发现Crash时的用户日志信息;
• 平台提供了丰富的归因能力,包括且不限于异常分析、多维分析、自定义上报、单点日志
查询等,结合灵活的报表能力可了解各类指标的趋势变化;
21. 感谢观看