【问题标题】:Memory being allocated正在分配的内存
【发布时间】:2011-09-08 14:06:24
【问题描述】:

通过使用 Chrome 开发工具,我发现正在分配数组和对象。我浏览了我的代码,寻找明显的[]{}new。但是没有。我检查了创建新的[]{}new 的函数,并查看了这些函数的使用位置,并且我学会了不使用它们。那么,内存还能怎么分配呢?

这对我来说是个问题,因为每次GC启动都会阻塞主循环,动画变得不一致。

【问题讨论】:

    标签: javascript memory memory-management


    【解决方案1】:

    过分担心内存分配是徒劳的。内存将被分配给所有东西,变量,数组,对象等。如果不使用变量或对象,你可以用 javascript 做很多事情,但同样,内存的分配并不是真正的 javascript 脚本。无论如何,任何和所有 javascript 都会使用一定程度的内存。事实上,我想说,如果你已经“学会了避免使用”对象和数组,那么你就被误导了或者正在学习错误的教训。

    避免循环引用、避免过多的内存消耗每个范围以及通常避免使用紧密循环和其他不良做法锁定浏览器线程更为重要。例如,在for 循环中,避免重新计算for 声明中的限制:for (var x = 1; x < myString.length; x++) 应为var max = myString.length; for(var x = 1; x < max; x++)。即使这样的优化(在大多数情况下是-优化)对于 javascript 开发人员来说也不是关键,因为浏览器正在处理整体内存分配/消耗以及垃圾收集范围外的引用。

    有关避免泄漏的实际做法的更多信息,请查看这篇文章:http://www.javascriptkit.com/javatutors/closuresleak/index.shtml(或其他类似文章)。否则,只要您没有泄漏内存,预计任何脚本都会分配/使用一定程度的内存;这是不可避免的。考虑到现代 PC 有 千兆字节 的可用内存,您的脚本微不足道的 千字节 甚至 兆字节 的内存使用并没有太大的影响 - 这就是内存是用来使用它的。

    【讨论】:

    • 我的问题是 GC 启动,破坏了完美流畅的游戏。但是很高兴知道内存实际上是如何分配的。谢谢
    • GC 因浏览器而异,对脚本来说应该是完全不透明的。事实上,没有办法从 javascript 手动触发或以其他方式与 GC 交互 - GC 作为 javascript 甚至不“知道”的东西而存在。大多数浏览器会在方便的时候运行 GC,当浏览器对前端活动(例如执行脚本)没有需求或需求很低时。如果有奇怪的性能问题,请查看您的代码,而不是 GC。
    • 你是说,因为主循环GC不能相应地工作,所以内存堆积,直到它别无选择,只能踢?
    • 如果你要强制一个永无止境的递归循环,那么是的,浏览器可能延迟 GC,直到它变得非常必要。与其持续循环,不如使用setTimeout 提供一些喘息空间。超时不像直接递归函数或循环那样严格,如果浏览器忙于其他事情(如 GC),则允许延迟触发超时,而永无止境的 for 循环不会被轻易中断。请记住,GC 只需要几毫秒就可以完成它需要做的事情。
    • 使用setTimout 我得到了同样的效果。循环是一个函数,setTimout 调用该函数,但内存仍在增长,然后 GC 启动。但从你所说的来看,这是自然的,因为实际上所有内容都分配给了内存。我要做的就是让 GC 有时间花几毫秒的时间进行清理,或者减少分配量。
    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多