如何在 Flutter 中查找内存泄漏?

Ham*_*and 17 dart flutter

我需要在 Flutter 中找到内存泄漏。如何找到它们?以及如何为测试创建内存泄漏?

Sat*_*dde 18

我在 android studio ide 中实现了内存泄漏测试。

第 - 1 步:将您的设备与 android studio 连接并在您的设备上运行您的应用程序。

第 - 2 步:转到查看 -> 工具窗口 -> Flutter 性能

第 - 3 步:窗口底部将出现“打开开发工具”选项,单击它。它将导航到浏览器的新窗口。有关更多详细信息,请参见下图:

在此处输入图片说明 在此处输入图片说明

第 4 步:按照屏幕截图执行以下步骤,您可以看到对象大小和详细信息。哪些是导致内存泄漏的。首先从可用菜单中选择“内存”,然后您可以在 ui 下方看到。 在此处输入图片说明

 1. Click on settings icon

 2. Select "Dart" and "Flutter"  from checkbox.

 3. Click on "Apply" button.
Run Code Online (Sandbox Code Playgroud)

第 5 步:这是最后一步,现在您可以看到内存泄漏信息。 在此处输入图片说明

1. Click on "Snapshot" it will be collect and display object list in bottom of the window.
2. Click on search icon and Here you can see those classes which objects are not destroyed. Suppose am selected "ApiRepository.dart" class and instance will be available in memory ,so that details are visible in window. If multiple objects created than you can see here the total no. of instance and total size.
Run Code Online (Sandbox Code Playgroud)

第 6 步:您可以使用“GC”手动调用垃圾收集器。您可以随时使用“重置”和“快照”按钮重置并获取最新快照。

有关内存分配相关详细信息的更多信息,请阅读以下文章:

https://medium.com/flutter/flutter-dont-fear-the-garbage-collector-d69b3ff1ca30 https://flutter.dev/docs/development/tools/devtools/memory

更新:开发工具 /内存


Iva*_*iuk 8

您可以从阅读官方文档开始 - https://docs.flutter.dev/development/tools/devtools/memory

接下来的步骤描述了如何运行内存视图以及如何手动创建内存泄漏

  1. 按“打开 Flutter DevTools”按钮。它打开浏览器。就我而言,它是 Safari(在 Mac 上)。如果您只看到白屏,请复制链接并将其粘贴到 Chrome。

在此输入图像描述

  1. 选择“内存”选项卡。

在此输入图像描述

  1. 按图表。您将看到所选时间段内的许多值。看一下“Dart/Flutter”内存使用情况。就我而言,它是 50.52 MB

在此输入图像描述

  1. 您可以使用以下代码模拟大量泄漏:

     import 'package:flutter/cupertino.dart';
     import 'package:flutter/material.dart';
    
     class MemoryLeakObject {
       final String text;
    
       MemoryLeakObject(this.text);
     }
    
     List<MemoryLeakObject> leakObjects = [];
    
     class MemoryLeaksScreen extends StatelessWidget {
       @override
       Widget build(BuildContext context) {
         return Scaffold(
           body: Center(
             child: CupertinoButton(
               child: const Text(
                 'Create 1 000 000 leaks',
               ),
               onPressed: () {
                 while (leakObjects.length < 1000000) {
                   leakObjects.add(
                     MemoryLeakObject('Count: ${leakObjects.length}'),
                   );
                 }
               },
             ),
           ),
         );
       }
     }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 打开包含上述代码的屏幕,然后按“创建 1 000 000 次泄漏”按钮。

  3. 再看一下图表。就我而言,“Dart/Flutter”内存使用量增加到 101.28 MB。还创建了内存中所有对象的快照。正如您所看到的,“MemoryLeakObject”类有 933365 个对象。

在此输入图像描述