【问题标题】:Javascript application memory handlingJavascript 应用程序内存处理
【发布时间】:2013-01-21 13:32:33
【问题描述】:

我有以下 JS:

var z = function(){
return "string";
}

var x = function(){
      var y = new z();
      var div = document.createElement('div');
      div.innerHTML = y;
      document.body.appendChild(div);
      /*
            my code…hundreds of other functions. Entire app is js all data comes through sockets and elements created using JS
     */
}

我有几个问题可能听起来很愚蠢,但我希望不会。

所以在'x'里面是'y'和'div'。现在,如果仅使用这 2 个元素,它们是否仍然“存在”在浏览器的 JS 中,还是消失了?
基本上我需要将它们设置为 null 以避免任何额外的内存被用于无用的项目。

另外,我使用 JS 编写了大约 25k 行,所有元素都是使用 JS 创建的。该应用程序会持续运行大约 9 个小时,直到他们关闭它并在另一天重新开始。
但是在这些时间里,我担心它会因为它的大小而变慢。这是真的吗?

【问题讨论】:

  • x 函数中的数百个其他函数显然是一种不好的做法。
  • @PaulD.Waite:我真的需要引用一些关于代码模块化的内容吗?我认为这是常识。
  • @Bergi:嗯,他的代码不一定不是模块化的,因为他在x 中有很多函数。不看就很难知道。 (我也认为我误解了你的评论:你说这“显然”是一种不好的做法,我认为你的意思是“我读过一些具体的东西说这是一种不好的做法;我自己也不确定。”)跨度>

标签: javascript performance oop memory browser


【解决方案1】:

就您的应用程序内存使用而言,每次调用x() 时,它都会创建一个局部变量y 的临时实例。一旦函数运行完成,这将被丢弃。 X 是一个匿名函数,赋予它一个新的作用域。新变量将在此范围内,this 也将成为函数对象,您可以使用 window 访问全局范围。

各种浏览器处理这种情况的方式会有所不同,但结果几乎相同。
浏览器一直在优化,以使它们在处理内存方面更高效,也更快。他们也在优化范围链查找成本,这应该会提高性能。

由于您的匿名函数 x() 的性质,浏览器可能会在某些时候运行其“垃圾收集”,这可能会减慢或停止脚本执行,但之后它应该可以正常运行。
现代浏览器中的 Javascript 引擎可以处理令人难以置信的处理,因为许多库(例如 jquery)需要大量处理。

我不会太担心 Javascript 引擎和你的 25k 行,这更多取决于你的代码本身和它在做什么。

【讨论】:

  • 我以为没问题,但现在我更有信心了。 Firefox 在运行 5/6 小时后使用 8900mb 内存,但新版本仅使用 400mb,仍然很多但比以前更好。谢谢
  • 哇,答案又快又长!
  • @Bergi 发布了我的第一个答案,但随后对其进行了编辑以添加更多位:)。我的技术。
  • @CraigTaub:我的也是,但在问题发布后不到 1:30 内你就已经准备好了 :-)
  • 以上我的意思是 900mb 不是 8900mb
猜你喜欢
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多