我有一个奇怪的情况,一个webapp一直在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)未发现此内存问题。
答案 0 :(得分:1)
如果你的'data'参数已经被jQuery用'new'关键字实例化,你应该编写这段代码:
…
$('#results').html( data.html );
delete data;
…
如果删除数据变量,则返回false。我想你什么都做不了。