51

V8 中这些对象之间的区别/联系是什么?上下文是否“属于”一个 Isolate,反之亦然?

我知道单个 Isolate 一次只能被一个线程访问(我猜这就是 v8::Locker 的用途?)。

我浏览了文档,但似乎无法掌握这些概念 - 任何帮助都将不胜感激!

4

2 回答 2

50

我确信以下是一个简化,但它适用于我。

隔离是 V8 运行时的独立副本,包括堆管理器、垃圾收集器等。一次只能有一个线程访问给定的隔离,但不同的线程可能同时访问不同的隔离。

但是,隔离不足以运行脚本。您还需要一个全局(根)对象。上下文通过将隔离堆中的对象指定为全局对象来定义完整的脚本执行环境。

因此,不仅可以在给定的隔离中“存在”许多上下文,而且它们还可以轻松安全地共享任何或所有对象。那是因为它们的对象实际上属于isolate,并且受到isolate的排他锁的保护。

于 2013-10-16T02:44:54.860 回答
44

Isolates顾名思义,对外界完全封闭,因此Isolates可以并行运行,因为它们完全是 V8 的不同实例。可以将其想象Isolate成一个沙箱——一个 V8 运行时环境。

现在Isolate,您可能会同时运行大量不相关的 JavaScript 应用程序。JavaScript 提供了许多全局级别的语言工具,让多个不相关的应用程序与这些“单例”混为一谈并不是一个好主意。因此,在一个名为 an 的 V8 实例中Isolate,您可以定义多个Contexts,以便不相关的应用程序可以做他们需要做的事情,而不会相互干扰。

这不是一个完美的类比,但如果您了解 Java Web 知识,请想象在同一台机器上部署了多个 Tomcat 实例,然后每个 Tomcat 实例运行具有自己的 Web 上下文和 web.xml 的单独应用程序。有点像这样。

希望有帮助。

于 2013-10-15T14:46:09.330 回答