我很好奇嵌套函数的node.js模式如何与v8的垃圾收集器一起工作。这是一个简单的例子
readfile("blah", function(str) {
var val = getvaluefromstr(str);
function restofprogram(val2) { ... } (val)
})
如果restofprogram是长时间运行的,那是否不意味着str将永远不会被垃圾回收?我的理解是,使用结点,您最终会获得很多嵌套函数。如果在外部声明了restofprogram,是否会收集垃圾,因此str不能在范围内?这是推荐做法吗?
编辑 我不想使问题复杂化。那只是粗心,所以我修改了它。
简单的答案:如果str
没有从其他任何地方引用的值(并且str
本身也没有从引用restofprogram
),则function (str) { ... }
返回时将无法访问它的值。
详细说明:V8编译器区分真正的 地方 ,从所谓的变量 背景 变量被关闭,由阴影捕获 与 语句来或eval
调用。
局部变量存在于堆栈中,并在函数执行完成后立即消失。
上下文变量位于分配给堆的上下文结构中。当上下文结构消失时,它们消失。这里要注意的重要一点是,来自同一作用域的上下文变量位于 同一
结构中。让我用示例代码进行说明:
function outer () {
var x; // real local variable
var y; // context variable, referenced by inner1
var z; // context variable, referenced by inner2
function inner1 () {
// references context
use(y);
}
function inner2 () {
// references context
use(z);
}
function inner3 () { /* I am empty but I still capture context implicitly */ }
return [inner1, inner2, inner3];
}
在这个例子中变量x
将尽快消失outer
的回报,但变量y
,并z
只有当将消失 两个 inner1
,inner2
和
inner3
死。发生这种情况是因为y
和z
分配在相同的上下文结构中,并且所有三个闭包都隐式引用此上下文结构(即使inner3
没有显式使用它)。
当你开始使用情况变得更加复杂 与 语句来, try / catch语句 ,其在V8中包含一个隐含的语句来 与
语句来里面的catch子句或全局eval
。
function complication () {
var x; // context variable
function inner () { /* I am empty but I still capture context implicitly */ }
try { } catch (e) { /* contains implicit with-statement */ }
return inner;
}
在此示例中,x
仅在inner
死亡时才会消失。因为:
这迫使x
成为上下文变量并inner
捕获上下文,x
直到上下文inner
消失为止。
通常,如果您要确保给定的变量保留某个对象的时间不超过实际需要的时间,则可以通过分配给该变量轻松地 破坏 此链接null
。
问题内容: 这是我到目前为止所读的内容,如果我写错了,请更正我: Node.js基于V8 JavaScript引擎。 V8 JavaScript引擎实现了世界垃圾收集 这导致Node.js有时完全关闭几秒钟到几分钟来处理垃圾回收。 如果这是为生产代码运行的,那么对于10,000个用户而言,这是几秒钟。 这在生产环境中真的可以接受吗? 问题答案: 是否可接受取决于您的应用程序和堆大小。Big Gc约
垃圾回收 我们对生产中花了很多时间来调整垃圾回收。垃圾回收的关注点与Java大致相似,尽管一些惯用的Scala代码比起惯用的Java代码会容易产生更多(短暂的)垃圾——函数式风格的副产品。Hotspot的分代垃圾收集通常使这不成问题,因为短暂的(short-lived)垃圾在大多情形下会被有效的释放掉。 在谈GC调优话题前,先看看这个Attila的报告,它阐述了我们在GC方面的一些经验。 Scal
对于开发者来说,JavaScript 的内存管理是自动的、无形的。我们创建的原始值、对象、函数……这一切都会占用内存。 当我们不再需要某个东西时会发生什么?JavaScript 引擎如何发现它并清理它? 可达性(Reachability) JavaScript 中主要的内存管理概念是 可达性。 简而言之,“可达”值是那些以某种方式可访问或可用的值。它们一定是存储在内存中的。 这里列出固有的可达值的
垃圾收集,引用计数,显式分配 和所有的现代语言一样,OCaml提供垃圾收集器,所以你不用像C/C++一样显式地分配和释放内存。 JWZ在他的文章 "Java sucks" rant(Java蛋疼(怒)!): 第一个好家伙是Java没有 free()。其他的都没有所谓了。这几乎掩盖了所有的缺点,不管有多糟糕, 这个有点让后续文档基本都没有意义了,但是...(译注:但是啥大家自己看吧) OCaml的垃
我有一个问题:伊甸园100%使用,旧的100%使用,从空间100%使用,但没有垃圾收集触发,没有oom -xmx2g-xms2g-xmn1g-xx:survivorratio=8-xx:permsize=256m-xx:maxpermsize=256m-xx:+heapdumponoutofmemoryerror-xx:reservedcodecachesize=128m-xx:initialco
问题内容: 如果我使用String.intern()来提高性能,因为我可以使用“ ==”来比较内部字符串,是否会遇到垃圾回收问题?内联字符串的垃圾回收机制与普通字符串有何不同? 问题答案: 实际上,这不是垃圾收集优化,而是字符串池优化。调用时,您用其基本引用(首次遇到此字符串的引用,如果尚不知道此引用,则为参考)替换对初始String的引用。 但是,一旦您的字符串不再在应用程序中使用,它将成为垃圾