js web工作程序内存泄漏
Memory leaks in js web-workers
当我尝试使用web工作者时,内存泄漏。我有4Gb内存和i5处理器。通常我有接近80%和90%CPU的空闲ram,但当我运行这个脚本时,我的计算机会在两分钟内冻结,当内存结束时。我不知道如何调查这个问题。我做了一些堆快照,但没有发现问题(我没有任何内存泄漏的经验)。有人能帮我吗?A可以提供任何其他信息。主要任务是找到素数并将其保存到数据库中。我认为问题可能是在使用数据库或将数据从客户端发送到工作者,反之亦然。对不起我的英语。thx
$(document).ready( function() {
$('#start_button').click( function() {
toggleButton();
});
});
var db = openDatabase("primeNumbers", "0.1", "Prime numbers db", 200000);
//check if db can be used
if(!db){alert("Failed to connect to database.");}
var currNumber = 2;
var work;
//create db if not exists
db.transaction(function (tx) {
tx.executeSql("CREATE TABLE IF NOT EXISTS primeNumbers (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, value INTEGER NOT NULL UNIQUE)", [], null, null);
});
//create worker for async calculations
var blob = new Blob([
" '
onmessage = function(event) { '
self.postMessage(isPrime(parseInt(event.data))); '
}; '
function isPrime(n) { '
if(n < 2) return '{'"status'":'"false'"}'; '
var q = parseInt(Math.sqrt(n)); '
for(var i = 2; i <= q; i++) { '
if (n % i == 0) { '
return '{'"status'":'"false'"}'; '
}; '
}; '
return '{'"status'":'"true'",'"value'":'"'+n+''"}'; '
};"
]);
var blobURL = window.URL.createObjectURL(blob);
var worker = new Worker(blobURL);
//worker event listener
worker.onmessage = function(event) {
json = $.parseJSON(event.data);
switch(Boolean(json['status'])) {
case true:
writeDataToDatabase(json['value']);
work && finder();
break;
case false:
currNumber++;
work && finder();
break;
default:
alert('Something went wrong');
};
};
function finder() {
if(work) {
worker.postMessage(currNumber);
currNumber++;
};
};
function writeDataToDatabase(value) {
db.transaction(function(tx) {
tx.executeSql('INSERT INTO primeNumbers (value) VALUES ('+ parseInt(value) +')');
});
};
function getMaxPrimeFromDb() {
var res;
db.transaction(function(tx) {
tx.executeSql('select max(value) as highestvalue from primenumbers', [], function(tx, result) {
res = result.rows.item(0)['highestvalue'];
});
if(res != undefined) {
currNumber = parseInt(res) + 1;
};
});
};
function toggleButton() {
btn = $('#start_button');
if(btn.text() != 'pause_calculations') {
btn.text('pause_calculations');
work = true;
getMaxPrimeFromDb();
finder();
} else {
btn.text('resume_calculations');
work = false;
};
};
我没有接触过太多的web工作人员或浏览器数据库存储,但数据库命令的占用空间似乎是异步的,这意味着你必须等待它们完成才能做任何事情。粗略地看,我希望所有对executeSql
的调用都有一个"done"处理程序,您可以在其中调用finder()
和work && finder()
之类的东西。您需要能够传递一个回调函数:
function writeDataToDatabase( value, callback ) {
db.transaction(function(tx) {
tx.executeSql('INSERT INTO primeNumbers (value) VALUES ('+ parseInt(value) +')', [], function() {
if( typeof callback === "function" ) callback();
});
});
};
function getMaxPrimeFromDb( callback ) {
var res;
db.transaction(function(tx) {
tx.executeSql('select max(value) as highestvalue from primenumbers', [], function(tx, result) {
res = result.rows.item(0)['highestvalue'];
if(res != undefined) {
currNumber = parseInt(res) + 1;
};
if( typeof callback === "function" ) callback();
});
});
};
然后在你的代码中使用它,如下所示:
...
writeDataToDatabase(json['value'], function() {
work && finder();
});
...
...
getMaxPrimeFromDb(function() {
finder();
});
...
相关文章:
- 重复应用 d3 转换导致的内存泄漏
- IE7中的blockUI插件内存泄漏25kb
- Javascript闭包-如何防止内存泄漏
- jQuery Draggable:内存泄漏
- "检测到可能的EventEmitter内存泄漏”;使用Gulp+Watchify+Factor捆绑包
- 在Dojo类中递归调用setTimeout时是否存在内存泄漏
- 是内存泄漏
- 将处理程序留在img.onload上是内存泄漏
- 具有并发sse连接的node.js内存泄漏
- 简单对象的Javascript内存泄漏
- WeakMap是否会将我从父/子关系的内存泄漏中拯救出来
- Javascript绘制画布内存泄漏
- 为什么我的svg节点在IE中泄漏内存
- AngularJS指令包装器与Kendo一起泄漏内存
- 经过几次清理尝试后,主干仍在泄漏内存
- 这个js代码如何泄漏内存
- 未处理的postMessage是否泄漏内存
- 动态创建和销毁三.js场景,而不会泄漏内存
- 我的PyV8上下文泄漏内存
- 为什么我的数字时钟功能泄漏内存