我计划做以下事情:
1. 启动一个worker。
2a. 这个worker必须加载一些巨大的数据(通过AJAX或importScripts),对其进行处理并获取结果,结果将保存在这个worker的变量中。
2b. 加载新的数据部分(必须替换先前的部分),对其进行处理并将所需的结果附加到变量中。
2c. ...等等。
3. 内存使用量会增加,因此我必须能够强制浏览器关闭该worker并“忘记”它。我会失去所有的数据,但可以摆脱内存损失。
4. 当我想要时,我会再次启动此worker。
请确保hugedata文件足够大,以便内存损失会立即显现。
步骤:1)打开“app.html”;2)点击“开始工作”,等待,检查控制台日志;3)点击“加载第二部分数据”,等待,检查控制台日志;4)点击“终止工作进程”或刷新页面;5)检查内存损失情况;6)重复步骤2-4以增加内存损失。
问题:如何真正关闭此工作进程,使其释放内存?或者如果不可能,如何真正刷新应用程序页面,让浏览器彻底“忘记”该工作进程并释放占用的内存?(因为按F5刷新页面无法解决内存问题)
1. 启动一个worker。
2a. 这个worker必须加载一些巨大的数据(通过AJAX或importScripts),对其进行处理并获取结果,结果将保存在这个worker的变量中。
2b. 加载新的数据部分(必须替换先前的部分),对其进行处理并将所需的结果附加到变量中。
2c. ...等等。
3. 内存使用量会增加,因此我必须能够强制浏览器关闭该worker并“忘记”它。我会失去所有的数据,但可以摆脱内存损失。
4. 当我想要时,我会再次启动此worker。
我在便携式基于Chrome的浏览器中进行了测试(启用了--allow-file-access-from-files
标志,否则Worker将无法启动):
app.html:
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<script src="jquery.js"></script>
<script>
$(function () {
$('#click').on("click", function () {
var w = new Worker('worker.js');
w.onmessage = function (event) {
console.log(event.data);
};
w.postMessage({
"url": "hugedata1.js"
});
$('#click2').on("click", function () {
w.postMessage({
"url": "hugedata2.js"
});
});
$('#terminate').on("click", function () {
w.terminate();
});
});
});
</script>
</head>
<body>
<div id="click">start worker</div>
<div id="click2">load second portion of data</div>
<div id="terminate">terminate worker</div>
</body>
</html>
worker.js:
var hugedataarr;
var myarr = [];
self.onmessage = function(event) {
importScripts(event.data.url);
myarr[myarr.length] = hugedataarr[0];
self.postMessage(myarr);
}
hugedata.js:
hugedataarr = [
{ "id": "1", "A": "b"},
//imagine millions of objects placed in here
{ "id": "5000000", "F": "g"}
]
hugedata2.js:
hugedataarr = [
{ "id": "5000001", "H": "i"},
//imagine millions of objects placed in here
{ "id": "10000000", "X": "y"}
]
请确保hugedata文件足够大,以便内存损失会立即显现。
步骤:1)打开“app.html”;2)点击“开始工作”,等待,检查控制台日志;3)点击“加载第二部分数据”,等待,检查控制台日志;4)点击“终止工作进程”或刷新页面;5)检查内存损失情况;6)重复步骤2-4以增加内存损失。
问题:如何真正关闭此工作进程,使其释放内存?或者如果不可能,如何真正刷新应用程序页面,让浏览器彻底“忘记”该工作进程并释放占用的内存?(因为按F5刷新页面无法解决内存问题)
hugedataarr = null
、hugedataarr = undefined
之类的操作......我只想要绝对地刷新页面,以便UA认为是第一次打开它,或者完全关闭Web Worker及其所有数据,使得UA的内存使用水平与Worker启动之前相同! - lyrically wickedworker.terminate()
都没有帮助。 - lyrically wickedworker.terminate()
怎么样?为什么它不能将内存使用量恢复到工作进程启动之前的状态?这是实现相关的吗? - lyrically wicked