我了解的是
除了V8 Engine的垃圾回收之外,是否还意味着foxx使用的任何内存在做出响应后立即被垃圾回收?
如果以上问题的答案为是,是否可以禁用V8 Engine的垃圾收集器,并且如果我禁用V8 Engine的GC,我可以期望更好的延迟吗?
如果我搞错了,请告诉我。
答案 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。