我们可以强制使用 Dart 垃圾收集器吗?

2024-03-30

我正在尝试模拟内存泄漏Streams(出于教育目的),但如果 GC 尚未运行,我无法确定内存是否真的泄漏。

我可以在纯 Dart 测试中强制执行 GC 扫描吗?


您可以通过 Dart DevTools Web GUI 来完成此操作。https://dart.dev/tools/dart-devtools https://dart.dev/tools/dart-devtools

更新了使用 vm_service 包的示例

对于较新的 Dart 版本,我们可以使用dart:developer用于与 Dart VM 通信的 API。新版也是这样Dart 开发工具 https://dart.dev/tools/dart-devtools从虚拟机获取数据并进行诸如触发垃圾收集器之类的操作,您仍然可以通过进入 Web 界面手动执行这些操作。

如果您想从代码本身触发此操作,可以使用vm_service https://pub.dev/packages/vm_service包,可以轻松地与 Dart VM 服务协议中的 API 进行交互。

可以在这里看到一个例子:

import 'dart:developer';
import 'dart:isolate';
import 'package:vm_service/vm_service_io.dart';

Future<void> main(List<String> args) async {
  final serverUri = (await Service.getInfo()).serverUri;

  if (serverUri == null) {
    print('Please run the application with the --observe parameter!');
    return;
  }

  final isolateId = Service.getIsolateID(Isolate.current)!;
  final vmService = await vmServiceConnectUri(_toWebSocket(serverUri));
  final profile = await vmService.getAllocationProfile(isolateId, gc: true);
  
  print(profile.memoryUsage?.heapUsage);
}

List<String> _cleanupPathSegments(Uri uri) {
  final pathSegments = <String>[];
  if (uri.pathSegments.isNotEmpty) {
    pathSegments.addAll(uri.pathSegments.where(
      (s) => s.isNotEmpty,
    ));
  }
  return pathSegments;
}

String _toWebSocket(Uri uri) {
  final pathSegments = _cleanupPathSegments(uri);
  pathSegments.add('ws');
  return uri.replace(scheme: 'ws', pathSegments: pathSegments).toString();
}

The getAllocationProfile https://pub.dev/documentation/vm_service/latest/vm_service/VmService/getAllocationProfile.html方法采用可选参数gc其记录为:

If gc提供并设置为 true,则在收集分配信息之前将尝试进行垃圾收集。无法保证垃圾收集会实际执行。

所以这确实是你能做的最好的事情。此外,此解决方案仅在程序启动时才有效--observe范围。因此,除了调试目的之外,不应将其用于其他目的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我们可以强制使用 Dart 垃圾收集器吗? 的相关文章

随机推荐

  • 如何使用已安装的斜纹登录网站?

    我刚刚安装成功TWILL https web archive org web 20180904160747 http twill idyll org 80 在 StackOverflow 一位非常支持的成员的帮助下在我的计算机上 你可以查看
  • 通用协方差和转换为 SuperType

    我有一个面向对象的问题 我认为它可以与通用协方差联系起来 我正在尝试构建一个模块化系统来导入不同类型的记录 模块包含常用方法 SalesModule 包含处理特定逻辑的函数 public interface IImportable void
  • 克隆 jQuery UI 日期选择器时出现问题

    我有一个 div 其中有一个日期选择器 我用这样的东西来克隆它 mydiv someDiv works fine so far mydiv find input datefield datepicker clone without the
  • C#BackgroundWorker 的文化

    我想为我的整个应用程序设置文化 我尝试了以下操作 Thread CurrentThread CurrentCulture CultureInfo CreateSpecificCulture wantedCulture Thread Curr
  • 浏览器之间盒子模型的不同解释

    我注意到浏览器之间在宽度方面存在差异TH标签被解释 特别是宽度计算中是否包含填充 我正在构建一个可重用的库 用于快速生成表格和设计表格样式 当然 对于表格数据 这意味着我可以完全控制我生成的代码 但我需要实际解决问题而不是为特定实例寻找黑客
  • Qt 和 CMake 因重复符号而失败

    我的 c qt 项目中有 3 个文件 并且我正在使用 CMake 我正在尝试编译它这里有一些代码 CMakeLists 包含 cmake minimum required VERSION 3 8 project untitled set C
  • Apache Commons Lang 2 与 3

    在我的应用程序中 我使用 apache commons Lang v 3 所需的图书馆给我一个 java lang ClassNotFoundException org apache commons lang StringUtils com
  • 在 Rails 中添加与 simple_form、nested_form 和 Twitter Bootstrap 内联的控件

    我正在使用 simple form nested form 和 Twitter Bootstrap 并尝试将nested form 中的 删除链接 与对象放在同一行 现在看起来像这样 http grab by eKDS http grab
  • 安装适用于 Python 的 cx_Oracle

    在 Debian 5 上 我一直在尝试为 python 安装 cx oracle 模块 但没有成功 首先 我安装了 oracle xe client 及其依赖项 按照以下链接中的教程here http le gall net pierric
  • MSXML 哪个版本开始支持解析 XML 1.1?

    如果我使用 MSXML6 dll 解析 XML 1 1 我将收到此错误 0xC00CE57F MSG E INVALID VERSION 版本号无效 XML 1 1 最初发布于 2004 年 2 月 4 日 令我惊讶的是 MSXML6 dl
  • TDD 新手:是否有带有测试的示例应用程序来展示如何进行 TDD?

    我真的很想进入 TDD 开发 但我不知道从哪里开始 我认为 查看代码并了解他们如何编写测试并使类可测试 这样我会更容易消化并开始使用自己 有谁知道任何示例或小型开源C 包含单元测试的应用程序 对于沙卡尔佩什来说 我会推荐 ObjectMen
  • with() 语句从 opencv 中的 VideoCapture 读取?

    我喜欢使用 with 语句来访问文件和数据库连接 因为如果出现错误或文件关闭 它会自动为我断开连接 f open file txt r for i in f print i f close versus with open file txt
  • 在 bash 中读取以空格分隔的文件,不会导致空字段崩溃

    我正在尝试在 bash 中读取多行制表符分隔的文件 格式要求为空字段 不幸的是 外壳正在将彼此相邻的字段分隔符折叠在一起 如下所示 IFS t read one two three lt lt lt one t tthree printf
  • Fletchers16 校验和适合小数据吗?

    使用直接实施维基百科弗莱彻的校验和 https en wikipedia org wiki Fletcher s checksum对于 BCA 和 CAB 以及 BAC 和 ACB 等数据 我们得到相同的校验和 这是预期的吗 Fletche
  • 如何覆盖默认的 maven-install-plugin 行为?

    我需要自定义工件安装 并且无法弄清楚如何覆盖默认工件 来自默认的 Maven 生命周期 所以我的问题是 如何在我的 pom xml 中配置 Maven 安装插件 以便它不执行默认安装并仅执行我的自定义安装文件目标 我试过没有 id 和默认安
  • 为什么不同的 case 条件体不在不同的范围内?

    为什么不同的案件主体不会自动属于自己的范围 例如 如果我要这样做 switch condition case CONDITION ONE int account 27373 case CONDITION TWO account var no
  • 资源包 Spring

    如何在 Spring MVC 中的一个类中访问来自资源包的消息 该类扩展自AbstractController 我努力了getMessageSourceAccessor getMessage a message 但它会抛出这个异常 org
  • 如何从数据库值生成选择列表?

    我想知道在包含数据库中的值而不重复任何代码的表单上拥有选择列表的最佳方法是什么 我认为有意义的是将这些数据加载到控制器中并将其传递给视图模型 这样我就可以使用SelectListFor lt gt 或其他任何内容以生成列表 然而 这意味着我
  • 使用 ALS 训练时 Spark 给出 StackOverflowError

    当尝试在 Spark 的 MLLib 中使用 ALS 训练机器学习模型时 我不断收到 StackoverflowError 这是堆栈跟踪的一个小样本 Traceback most recent call last File Users us
  • 我们可以强制使用 Dart 垃圾收集器吗?

    我正在尝试模拟内存泄漏Streams 出于教育目的 但如果 GC 尚未运行 我无法确定内存是否真的泄漏 我可以在纯 Dart 测试中强制执行 GC 扫描吗 您可以通过 Dart DevTools Web GUI 来完成此操作 https d