2016-12-08 63 views
0

我学习了使用C/C++编程,所以在Javascript中进行内存管理对我而言并不直观。Javascript中的内存管理

我知道所有变量都位于堆内存中,而不是堆栈内存中,所以内存操作非常昂贵。如果所有对变量的引用都无法访问,它可以被垃圾收集,但它看起来像V8不会立即做垃圾收集? (用--trace_gc观察)

要释放全局数组对象的内存,可以通过array = null来完成,array = []会有相同的效果吗? (即使清除后,我需要该变量的行为类似于数组)。

根据我的经验,StringNumber通过值传递给函数,而ObjectArray通过引用传递给函数。如果String非常大,并且函数实际上允许它通过引用安全地传递(只读取字符串),V8会如此优化吗?

ES6引入了块范围声明let关键字,但在单次使用的let使得整个功能变得更慢,所以我仍然坚持var即使let/const更接近C/C++,我很熟悉。 (使用从master分支构建的d8进行测试,我知道V8开发人员正在积极研究这个bug)。

试图使用Chrome开发工具来学习我的代码的内存管理,但无法确定这些来自profiler的图形和图表的实际意思。

+1

不要发送垃圾邮件标签。你的问题与C++没有任何关系,即使你把它当作一个兼容的东西 – StoryTeller

+1

你并不需要担心JS中的内存太多。让浏览器照顾它。 – Cerbrus

+0

听起来你可能会试图过早地优化。您可以[在这里查阅此便捷图表](https://xkcd.com/1691/)以验证是否属实。 – vlaz

回答

1

基本上,当你想要自己管理你的内存和一大堆相当技术的东西时,你需要做C++。

如果你不想让你去找c#/ Java,因为有一个管理内存的虚拟机。

同样的JavaScript浏览器管理内存,除非您正在加载数千个元素的页面或编写库来显示/计算数千个数据,否则不会有任何内存问题。

请注意,当array = null将取消引用现有数组时,array = []将影响新的空数组的引用。既然它是空的,如果你尝试使用它将不起作用,所以去array=[]

如果您还不确定,那么只需使用适当的库为您完成工作。