v8::Isolate和v8::Context之间的确切区别是什么?

56

在V8中,这些对象之间有什么区别或连接?上下文是否“属于”隔离或反之亦然?

我知道单个隔离一次只能由一个线程访问(我猜这就是v8 :: Locker的作用?)。

我已经查看了文档,但似乎无法掌握这些概念 - 欢迎任何帮助!

2个回答

57

我相信以下内容是简化的,但对我来说有效。

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

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

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


3
如果对象存储在上下文中,那么如何使多个上下文共享对象,这个问题比v8isolate和v8context的实际概念更加令人困惑。 - martinkunev
2
对象存储在隔离堆中,因此可以在隔离内的所有上下文之间共享。 - BitCortex
知道上下文可以共享对象对我来说是一个真正的“啊哈”时刻。我没有在其他地方看到这种陈述,所以感谢您写下这篇文章。 - Liam Goodacre
有人可能会说,一个上下文会"微笑着"涵盖所有其他作用域-接收者-对象-参数-成员-方法-上下文。 - Nick Carducci for Carface Bank

51
如其名,隔离(Isolates)完全封闭于外部世界,因此可以并行运行,因为它们是完全不同的 V8 实例。将一个隔离看作沙盒 - 一个 V8 运行时环境。

现在,在一个隔离中,你可能会有许多不相关的 JavaScript 应用程序同时运行。JavaScript 提供了许多全局级别的语言设施,让多个不相关的应用程序操纵这些“单例”并不是一个好主意。因此,在称为隔离的 V8 实例内,您可以定义多个上下文(Contexts),以便不相关的应用程序可以按照自己的需求执行而不会相互干扰。

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

希望对你有所帮助。


隔离区共享相同的平台信息,因此它们并非完全隔离。它们并不是完全不同的。 - xaxxon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接