在图像之间切换时Javascript内存泄漏(FireFox4)
我认为,我有一个相当简单的javascript。 如果我真的运行得很快,那么情况就会恶化,Firefox4中的内存分配就会不断增加。我在chrome上试过,内存似乎保持稳定 这是FF4的问题还是我的JavaScript构建得很差 注意:页面上没有加载其他JS文件。我在“安全模式”下运行FF,所有插件都被禁用。没有加载其他选项卡在图像之间切换时Javascript内存泄漏(FireFox4),javascript,firefox,memory-leaks,Javascript,Firefox,Memory Leaks,我认为,我有一个相当简单的javascript。 如果我真的运行得很快,那么情况就会恶化,Firefox4中的内存分配就会不断增加。我在chrome上试过,内存似乎保持稳定 这是FF4的问题还是我的JavaScript构建得很差 注意:页面上没有加载其他JS文件。我在“安全模式”下运行FF,所有插件都被禁用。没有加载其他选项卡 <img id="heartbeat" name="heartbeat" src="/web/resources/graphics/greylight.png" /
<img id="heartbeat" name="heartbeat" src="/web/resources/graphics/greylight.png" />
<script type="text/javascript">
var hasTimedout = 1;
var lastPollTime = new Date();;
var maxDifference = 6000 * 2; //allows us to miss one poll of the data without showing anything bad
function heartbeat()
{
var curTime = new Date();
var diff = curTime.getTime() - lastPollTime.getTime();
if (diff > maxDifference && hasTimedout == 0)
{
document.getElementById('heartbeat').src = '/web/resources/graphics/greylight.png';
hasTimedout = 1;
}
else if (diff < maxDifference && hasTimedout == 1)
{
document.getElementById('heartbeat').src = '/web/resources/graphics/greenlight.png';
hasTimedout = 0;
}
toggle_visibility('heartbeat');
}
function toggle_visibility(id) {
var e = document.getElementById(id);
if (e.style.display == 'block')
e.style.display = 'none';
else
e.style.display = 'block';
}
setInterval("heartbeat()",20);
</script>
var Hastinmedout=1;
var lastPollTime=新日期();;
var最大差值=6000*2//允许我们在不显示任何不良信息的情况下错过一次数据投票
函数heartbeat()
{
var curTime=新日期();
var diff=curTime.getTime()-lastPollTime.getTime();
if(diff>maxDifference&&hastinmedout==0)
{
document.getElementById('heartbeat').src='/web/resources/graphics/greylight.png';
Hastinmedout=1;
}
else if(diff
有关Javascript垃圾收集的一些信息:
特别感兴趣的(也许):
- 使用delete语句。每当你 使用新对象创建对象 语句,将其与delete配对 陈述这确保了所有 与数据关联的内存 对象,包括其属性名, 可用于垃圾收集。 讨论delete语句 更多信息请参见“释放对象”
- 使用var关键字。任何变量 创建时不使用var关键字 在全局范围内创建,并且 从来没有垃圾的资格 收藏,展示 内存泄漏的机会
否则代码看起来很好。请不要将字符串传递给
setInterval
和setTimeout
-它是eval
伪装的:(马特·鲍尔的意思是你的setInterval调用应该是setInterval(heartbeat,20)
不断无限增加或有时下降?这可能只是FF和Chrome中垃圾收集器之间的差异。您应该使用布尔值表示Hastinmedout
,那里没有数字的原因。此外,您可以直接减去日期,不需要。getTime()
首先在他们身上。@Matt感谢setTimeout
提示。我会改变它。它是一个数字只是因为遗留的原因。@Emmerman-不,它会随着时间的推移不断增加,所以可能不是GC问题。使用delete
显然有帮助,但它仍然在增加。+1