下面我创建了一个简单的测试用例,显示当 img 标签的 src 设置为不同的 dataUrls 时,它会泄漏内存。在将 src 更改为其他内容后,看起来图像数据永远不会被卸载。
<!DOCTYPE html>
<html>
<head>
<title>Leak Test</title>
<script type="text/javascript">
canvas = null;
context = null;
image = null;
onLoad = function(event)
{
canvas = document.getElementById('canvas');
context = canvas.getContext('2d');
image = document.getElementById('image');
setTimeout(processImage, 1000);
}
processImage = function(event)
{
var imageData = null;
for (var i = 0; i < 500; i ++)
{
context.fillStyle = "rgba(" + Math.floor(Math.random() * 256) + "," + Math.floor(Math.random() * 256) + "," + Math.floor(Math.random() * 256) + "," + Math.random() +")";
context.fillRect(0, 0, canvas.width, canvas.height);
imageData = canvas.toDataURL("image/jpeg", .5);
image.src = imageData;
}
setTimeout(processImage, 1000);
}
</script>
</head>
<body onload="onLoad(event)">
<canvas id="canvas"></canvas>
<img id="image"></img>
</body>
</html>
如果您加载此 html 页面,RAM 使用量会随着时间的推移而增加,并且永远不会被清理。这个问题看起来非常相似:使用 Data URI 快速更新图像会导致缓存、内存泄漏。我能做些什么来防止这种内存泄漏吗?