【问题标题】:How to find memory leaks in Flutter?如何在 Flutter 中查找内存泄漏?
【发布时间】:2022-01-28 22:46:42
【问题描述】:

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

【问题讨论】:

  • 你尝试运行 DevTools 了吗?
  • @FernandoRocha 是的,但是为了测试和学习,我需要进行泄漏并检查更改以了解其工作原理。我不知道如何在 Flutter 中做到这一点。

标签: flutter dart


【解决方案1】:

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

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

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

步骤 - 3: 窗口底部会出现“Open Dev Tools”选项,点击它。它将导航到浏览器的新窗口。 详情见下图:

步骤 - 4: 按照屏幕截图执行以下步骤,您可以查看对象大小和详细信息。这是导致内存泄漏的原因。 首先从可用菜单中选择“内存”,然后您可以在 ui 下方看到。

 1. Click on settings icon

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

 3. Click on "Apply" button.

步骤 - 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.

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

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

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

更新: devtools/memory

【讨论】:

    【解决方案2】:

    你可以先阅读官方文档-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}'),
                     );
                   }
                 },
               ),
             ),
           );
         }
       }
      
    2. 使用上面的代码打开屏幕,然后按“创建 1 000 000 个泄漏”按钮。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      • 2014-03-26
      • 1970-01-01
      • 2017-11-29
      相关资源
      最近更新 更多