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秒
  • 使用ファイル: 現在のプロジェクトの web ディレクトリにコピーされた chromium\chrome.dll.pdb
  • Windows 64ビットとLinux 64ビットで試しました

メモリ リークは Dartium にのみ存在します。コードを JS にコンパイルして Firefox で実行すると、メモリ使用量が最大 3.5 GB になり、そこにとどまります。

これは本当にバグですか、それとも何か問題がありましたか?

4

2 に答える 2

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 に答える
0

ここに別の質問があり、HttpRequest でのメモリ リークを示唆しています。ただし、Dart の問題トラッカーで何も見つかりません。これが実際のメモリ リークであると思われる場合は、バグを報告する価値があるかもしれません。

于 2014-09-14T15:16:47.773 に答える