我了解的是


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


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

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

最佳答案

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

10-07 16:34