【发布时间】:2016-12-08 13:59:46
【问题描述】:
我学习了 C/C++ 编程,所以 Javascript 中的内存管理对我来说从来都不是直观的。
我知道所有变量都位于堆内存而不是堆栈内存中,因此内存操作非常昂贵。如果一个变量的所有引用都不再可访问,它可以被垃圾回收,但看起来 V8 不会立即进行垃圾回收? (用--trace_gc观察)
释放全局数组对象的内存,可以通过array = null来完成,array = []会不会有同样的效果? (即使在我清除它之后,我也需要该变量表现得像一个数组)。
根据我的经验,String 和 Number 按值传递给函数,而 Object 和 Array 通过引用传递给函数。如果String 很大,而且函数实际上允许它安全地通过引用传递(只读取字符串),V8 会这样优化吗?
ES6 为块作用域声明引入了let 关键字,但是单独使用let 会使整个函数变慢,所以我仍然坚持使用var,即使let/const 更接近C/C++我很熟悉。 (使用从 master 分支构建的 d8 进行测试,我知道 V8 开发人员正在积极处理这个错误)。
尝试使用 Chrome DevTools 来了解我的代码的内存管理,但无法弄清楚分析器中的那些图形和图表的实际含义。
【问题讨论】:
-
不要垃圾标签。您的问题与 C++ 无关,即使您将其用作兼容性
-
你真的不需要太担心 JS 中的内存问题。让浏览器来处理它。
-
听起来你可能试图过早地进行优化。您可以consult this handy chart over here 验证是否是这种情况。
-
我喜欢尝试编程语法并学习如何编写正确的代码(无论是为了语义 还是 性能)。我不认为这是过早的优化(我知道 Knuth 的名言)
-
整个“内存管理”思维方式不适用于 JavaScript。这可能不是学习编写正确代码的正确角度。
标签: javascript memory v8