【问题标题】:Memory management in Javascript [closed]Javascript中的内存管理[关闭]
【发布时间】:2016-12-08 13:59:46
【问题描述】:

我学习了 C/C++ 编程,所以 Javascript 中的内存管理对我来说从来都不是直观的。

我知道所有变量都位于堆内存而不是堆栈内存中,因此内存操作非常昂贵。如果一个变量的所有引用都不再可访问,它可以被垃圾回收,但看起来 V8 不会立即进行垃圾回收? (用--trace_gc观察)

释放全局数组对象的内存,可以通过array = null来完成,array = []会不会有同样的效果? (即使在我清除它之后,我也需要该变量表现得像一个数组)。

根据我的经验,StringNumber 按值传递给函数,而 ObjectArray 通过引用传递给函数。如果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


【解决方案1】:

基本上,当你想自己管理你的内存和一大堆相当技术性的东西时,你会使用 c++。

如果您不想选择 c#/Java,因为有一个虚拟机管理内存。

浏览器管理内存的 JavaScript 也是如此,除非您加载包含数千个元素的页面或编写库来显示/计算数千个数据,否则您不会遇到任何内存问题。

请注意,array = [] 将影响对新空数组的引用,而 array = null 将取消对现有数组的引用。既然是空的,如果你尝试使用它是行不通的,那就去array=[]吧。

如果您仍然不相信,那么只需使用适当的库来为您完成这项工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2018-08-17
    • 2018-02-17
    相关资源
    最近更新 更多