2013-06-30 151 views
3

我使用HttpRequest进行游戏,发现内存在任何请求后都没有清理。 经过一段时间Chrome中的运行选项卡将崩溃。由于HttpRequest导致内存泄漏直至崩溃

以下是一些测试代码。将大文件放入'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秒
  • 使用的文件:铬\ chrome.dll.pdb复制到web目录的当前项目
  • 在Windows 64bit以及Linux 64bit下试用

内存泄漏只存在于Dartium中。当我将代码编译为JS并在Firefox中运行时,内存使用量将高达3.5 GB,并保持在那里。

这真的是一个错误还是我有什么问题?

+2

我对你的文章做了一个相当大的编辑,删除了几个永远不会被调用的函数,并且使得所有的行都适合。据我所知,这抓住了你想分享的一切...... –

+0

无法用Dartium发射或JS发射(Firefox)重现。 – MarioP

+0

我重新检查了代码,并在我的文章中添加了一些其他信息。 –

回答

0

还有一个问题here,提示HttpRequest中有内存泄漏;但是我无法在Dart问题跟踪器中找到任何内容。如果你认为这可能是一个真正的内存泄漏,它可能是值得的raising a bug

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()); 
    }); 
    }); 
}