arangodb的foxx何时收集垃圾?

时间:2018-11-13 13:45:14

标签: arangodb foxx

我了解的是

  • Foxx基于V8引擎。
  • Foxx是多线程的,并且不与其他线程共享状态
  • Foxx的线程一将响应发送给客户端,就会退出(这是正确的术语吗?)。

除了V8 Engine的垃圾回收之外,是否还意味着foxx使用的任何内存在做出响应后立即被垃圾回收?
如果以上问题的答案为是,是否可以禁用V8 Engine的垃圾收集器,并且如果我禁用V8 Engine的GC,我可以期望更好的延迟吗?

如果我搞错了,请告诉我。

1 个答案:

答案 0 :(得分:4)

与许多其他解释器相比,javascript解释器具有特殊功能。它们需要在多个浏览器窗口中运行,并且一个窗口不应该知道另一个窗口。

因此,解释器操作集与其通用逻辑严格分开。在 在V8中,此概念以名称Isolate实现。

ArangoDB产生多个隔离,每个Foxx都可以在其中运行。ArangoDB的基础结构具有到隔离中的钩子,可以表示有新的可用集合。但是,没有这种钩子可以在Foxx中使用。

ArangoDB是多线程的。请求代理将读取请求,如果发现应执行Foxx请求(而不是直接AQL调用),它将从池中选择一个隔离,并在该V8上下文中继续执行。因此,既不能保证您达到相同的工作线程,也不能保证在后续请求中选择相同的隔离。

每个隔离都可以单独进行垃圾收集,而不会阻塞其他隔离中的执行。 ArangoDB Exposes statistics about these contexts,因此您可以在那里看到可以标记dirty的隔离,这意味着它们应该被垃圾收集。您可以使用require("internal").wait(<seconds>, true)手动调用垃圾回收。产生的上下文数量取决于系统拥有的CPU数量。但是,these settings can be configured.因此,您会发现策略与调整Java GC完全不同。

在请求之后,Foxx本身将丢弃服务分配的结构。然后,它们将在后续请求中不可用,并且一旦垃圾回收运行,它们的内存将返回给系统。

通常,您应该努力使Foxx服务在您执行的AQL周围变薄。 虽然应该将性能视为功能,但是通常在代码达到一定成熟度后就开始对其进行研究。我们解释了howto create usage scenarios and measure and optimize possible throughputs in our blog post series;虽然此处没有直接提及Foxx服务,但是那里使用的策略也可以应用于Foxx。