app内存问题

[toc]

app内存问题

一、如何排查内存问题

参考文章:

2内存-③内存泄漏定位.md

二、优化前后数据对比

时刻 目前情况 取消图片缓存扩容设置 去掉TTF文件初始化
打开APP时 img img img
滑动瀑布流 img img img
优化效果说明 优化后,在滑动瀑布流的时候,内存从原来的稳定1.24G,降低到稳定的896M 优化后,打开APP时,内存明显再降低了80M左右

问1:滑动过程中的突刺是什么操作产生?

问2:滑动过程内存增加用户操作是?增加后,内存增加到峰值就没增加的原因?如果估算峰值/峰值是该数值有计算方法?

问3:去掉ttf后,内存降低的数值怎么计算?是1:1的方式?

三、下载的内存分析和优化

以下载以下文件为例,

网络资源:https://media.xihuanwu.com/applet/wishhouse/reward/svga/rocket.svga (13MB)

序号 步骤 Dio 5.2.1
(Flutter)
HTTP 0.13.6
(Flutter)
OkHttp3 4.10.0
(Android)
0 未下载时 同左 同左
1.1 rocket.svga–13MB
下载过程峰值
1.2 rocket.svga–13MB
下载结束后置放
1.3 rocket.svga–13MB
下载结束后切换后台
1.4 rocket.svga–13MB
下载结束后切换后台回前台
2.1 rocket.svga–13MB
下载过程峰值
2.2 rocket.svga–13MB
下载结束后
3.1 rocket.svga–13MB
下载过程峰值
3.2 rocket.svga–13MB
下载结束后
4.1 rocket.svga–13MB
下载过程峰值
4.2 rocket.svga–13MB
下载结束后
5.1 rocket.svga–13MB
下载过程峰值
5.2 rocket.svga–13MB
下载结束后
884M
小结 在5次下载后,内存占用达到884MB,尝试将应用切换至后台、置放、手动GC,内存均无变化。①每次下载内存增加?②下载的内存并没有办法得到释放? 原来的触发下载改为此项后,内存无影响变化

结论:

​ 通过以上数据可以看出,Flutter实现在每次下载时,内存都发生了显著的上升,而原生实现表现平稳,在执行以上操作后,Flutter实现的内存占用达到了 884MB,而原生为 284MB,相比Flutter实现 少了600MB的内存占用。

建议将现有下载转为原生实现,从而降低资源下载时的内存使用。

ARC中方法创建的内存释放

1
2
3
4
5
6
7
8
- (void)exampleMethod {
// 创建一个局部对象,并且有一个强引用
NSObject *object = [[NSObject alloc] init];

// 做一些操作...

// 当对象离开作用域,强引用计数减1,如果为0,则对象被释放
}

@autoreleasepool中的内存释放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- (void)exampleWithAutoreleasePool {
// 进入一个自动释放池块
@autoreleasepool {
// 创建一个autorelease对象,它会被放入自动释放池中
NSObject *autoreleaseObject = [[NSObject alloc] init];

// 做一些操作...

// 当这个@autoreleasepool块结束时,autoreleaseObject会被释放
}

// 在自动释放池块外,尝试访问autoreleaseObject会导致崩溃,因为它已经被释放了
// NSObject *accessAfterRelease = autoreleaseObject; // 这将导致崩溃
}