持续的页面刷新会导致Firefox增加窗口的内存消耗



我遇到了一个奇怪的情况,一个网络应用程序在Firefox/Windows上不断耗尽内存。基本上,应用程序通过jQuery对服务器进行POST调用来刷新页面中的数据。每次调用时,Firefox的内存消耗量都会增加,与服务器返回的数据大小不成比例。

为了查看这是否是我的应用程序特有的,我使用Sinatra(Ruby 1.9.2-p318)和jQuery(1.7.1)编写了一个简单的测试应用程序。该应用程序每10秒向服务器发送一个请求,并将1MB的html块加载到页面:

服务器端:

require 'rubygems'
require 'sinatra'
require 'erb'
require 'json'
configure do
  set :static, true
end
post '/' do
  content_type :json
  # a simple html file containing ~ 1MB of data  
  html = File.read( File.join(File.dirname(__FILE__), 'html.txt' ) )
  # convert to JSON and return to the client
  return { "html" => html }.to_json
end

客户端:

<!doctype html>
<html>
  <head>
    <script type="text/javascript" src="/js/jquery-1.7.1.min.js"></script>
  </head>
  <body>
    <h1>Test Page</h1>
    <div id="results" style="display: none;"></div>
    <script type="text/javascript">
      $(function(){
        // refresh the data every 10 sec
        setInterval( function(){ doRefresh(); }, 10 * 1000 );
      });
      function doRefresh() {
        $.post('/', function(data){
          $('#results').html( data.html );
          // attempt to free some memory
          delete data;
        }, 'json');
      }
    </script>
  </body>
</html>

似乎没有改变的是,Firefox进程的内存消耗(通过Windows的任务管理器观察到)每次调用都会以10兆字节的速度增长。尽管新数据取代了页面中的旧数据,但Firefox似乎没有处理内存中分配的空间。事实证明,如果页面在一夜之间打开(在简单的4GB机器上),这会完全耗尽内存。

这是javascript问题还是Firefox的问题?我能以某种方式强制垃圾收集吗?谢谢

编辑:Google Chrome(Win7上为13.0.782.112)未发现此内存问题。

如果jQuery已经用"new"关键字实例化了您的"data"参数,那么您应该编写以下代码:

…
$('#results').html( data.html );
delete data;
…

如果删除数据变量,则返回false。我想你什么都做不了。

最新更新