文章插图
文章插图
这里有一点需要注意,Observatory显示的Dart VM占用的内存信息要远远小于Android Profile/Xcode检测出的内存大小,因为存在部分只有系统工具能检测出的内存区块,例如一些完全不依赖于DartVM的skia对象,并且layer在engine中创建时并不能明确知道大小,所以采用虚拟近似值代替 。
-
//engine/lib/ui/painting/engine_layer.cc
-
...
-
size_tEngineLayer::GetAllocationSize {
-
// Provide an approximation of the total memory impact of this object to the
-
// Dart GC. The ContainerLayer may hold references to a tree of other layers,
-
// which in turn may contain Skia objects.
-
return3000;
-
};
常见内存问题
- 未取消注册或回调导致内存泄露
-
classDownloadManagerextendsObject{
-
......
-
abstractclassDownloadListener{
-
void completed(DXTemplateItem item);
-
void failed(DXTemplateItem item, String errorInfo);
-
}
-
staticList<DownloadListener> listenerList = List;
-
staticvoid downloadSingleTemplate(DXTemplateItemtemplate, DownloadListener listener) async{
-
listenerList.add(listener);
-
...
-
}
-
...
-
// 移除
-
staticvoid removeDownloadListener(DownloadListener listener) {
-
if(listener != && listenerList != && listenerList.contains(listener)) {
-
listenerList.remove(listener);
-
}
-
}
- 资源未关闭或释放导致内存泄露,例如ImageStream的图片资源有没有被正常关闭导致的内存泄漏 。
-
void _resolveImage {
-
finalImageStream newStream =
-
widget.image.resolve(createLocalImageConfiguration(context));
-
assert(newStream != );
-
_updateSourceStream(newStream);
-
}
-
@override
-
void dispose {
-
...
-
_imageInfo.image.dispose;
-
_imageInfo = ;
-
super.dispose;
-
}
- PlatformAssetBundle.loadString通过asset读取String内容会一直缓存读取的内容,造成内存无法释放
-
/// 通过asset读取Json
-
Future<Map<String, dynamic>> loadJsonAsset(String assetPath) async{
-
_rootBundle ??= PlatformAssetBundle;
-
finalString jsonStr = await _rootBundle.loadString(assetPath);
-
return json.decode(jsonStr);
-
}
-
/// 通过asset读取Json
-
Future<Map<String, dynamic>> loadJsonAsset(String assetPath) async{
-
_rootBundle ??= PlatformAssetBundle;
-
finalString jsonStr = await _rootBundle.loadString(assetPath, cache: false);
-
return json.decode(jsonStr);
-
}
文章插图
- 另外很多同学有反馈过Flutter带图片的长列表滑动会造成内存一直上涨,flutter在1.17版本对这个问题做了优化,具体改动可以参考pr 14265 。
推荐阅读
- 二千左右的家用电脑如何配置?2200G处理器+16G内存,还带显示器
- Android 性能优化——内存优化
- |跟着大师学钓鱼01:抛竿压线定位及相关技巧
- 周鸿祎宣布360企业安全集团新定位:新时代的网络安全运营商
- 万字详文:Java内存泄漏、性能优化、宕机死锁的N种姿势
- 聊聊虚拟内存
- 电脑内存容量真的是越大越好吗?
- C语言中的动态内存分配与变长数组
- 计算机内存管理介绍
- ipad pro要买16g吗?ipad pro内存容量有6GB的嘛?