3

我玩了 HttpRequest 并意识到在任何请求后都没有清理内存。一段时间后,Chrome 中的运行选项卡将崩溃。

这是一些测试代码。将一个大文件放入“web”目录并相应地在代码中设置 URL。

import 'dart:async';
import 'dart:html';

void main() {
  const PATH = "http://127.0.0.1:3030/PATH_TO_FILE";
  new Timer.periodic(new Duration(seconds:10), (Timer it)=>getString(PATH));
}

void getString( String url){
  HttpRequest.getString(url).then((String data){
  });
}

刚复查,内存泄漏依然存在:

  • 当前版本:24275
  • 使用时长:30 秒
  • 使用的文件:chromium\chrome.dll.pdb 复制到当前项目的 web 目录
  • 在 Windows 64bit 和 Linux 64bit 下试过

内存泄漏仅存在于 Dartium 中。当我将代码编译为 JS 并在 Firefox 中运行时,内存使用量上升到 3.5 GB 并保持不变。

这真的是一个错误还是我做错了什么?

4

2 回答 2

0

这里还有一个问题,提示HttpRequest存在内存泄漏;但是我在 Dart 问题跟踪器中找不到任何东西。如果您认为这可能是真正的内存泄漏,那么可能值得提出一个错误

于 2014-09-14T15:16:47.773 回答
0

有问题,但已关闭。
最近宣布了一项更改,要求明确关闭请求,否则它会保持打开状态 15 秒(默认值)。

有关更多详细信息,请参阅https://code.google.com/p/dart/issues/detail?id=20833上的讨论。

import 'dart:io';

void main(List<String> args) {
  HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 9090).then((server) {
    server.listen((HttpRequest request) {
      var client = new HttpClient();
      client.getUrl(Uri.parse("https://www.google.com")
          .then((req) => req.close())
          .then((resp) => resp.drain())
          .whenComplete(() {
            client.close();
            request.response.close();
          });
    });
  });
}

在这样的代码中,拥有一个全局共享的 HttpClient 实例是正确的做法,因为它将处理共享持久连接。

import 'dart:io';

void main(List<String> args) {
  HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 9090).then((server) {
    server.listen((HttpRequest request) {
      var client = new HttpClient();
      client.getUrl(Uri.parse("https://www.google.com")
          .then((req) => req.close())
          .then((resp) => resp.drain())
          .whenComplete(() => request.response.close());
    });
  });
}
于 2014-09-14T15:24:24.120 回答