GC预计会占用32%的运行时间吗?

时间:2019-05-04 18:01:15

标签: node.js optimization garbage-collection profiling

当前正在优化库以提高速度。我已经通过Webstorm使用V8 CPU and Memory Profiling大大减少了执行时间。这主要是通过从recursive to iterative更改核心方法来实现的。

现在,自我时间分布细分为

enter image description here

我假设第一个条目“ node”是对内部函数调用进行计时,这很棒。其他条目也很有意义。我是Nodejs分析的新手,但GC的31.6%似乎很高,所以我决定进行调查。

我现在已经通过Webstorm创建了一个堆转储,但是不幸的是,这并没有给我太多信息。

enter image description here

这些似乎主要是系统内部存储器引用。再次遍历核心iteration code logic,似乎也没有很多地方明确分配内存(使用this作为参考)。

问题

  • GC开销可以减少吗?
  • 这是刚刚分配的金额吗?
  • 是否可以获得更好的内存配置信息?

设置说明

万一有人想尝试调试它,我会提供设置说明。

下载或克隆object-scan并运行

yarn install --frozen-lockfile
yarn run test-simple --verbose

现在在项目根目录中创建一个包含this content的文件test.js,然后运行node --trace_gc test.js或通过Webstorm运行该文件以进行高级配置。

1 个答案:

答案 0 :(得分:1)

在Javascript和v8(节点)中,尤其是垃圾回收所花费的时间取决于堆中存储的数据量,但这只是众多因素之一。

在v8引擎中,GC有两种主要的“类型”:次要(清除)和主要(标记扫描/标记紧凑)。您可能会在启用--trace-gc的控制台中看到测试期间发生的GC类型。在不同情况下,一种类型可能比其他类型“消耗”更多的时间,反之亦然。因此,在进行优化之前,您应该确定哪个gc需要更多时间。

优化主要GC的选择不多,导致它受到“长时间”(实际上,在这种情况下很长的时间意味着对象可以通过清除GC)生存在内存中的数据量很大的影响。这样的数据存储在堆中所谓的“旧空间”中。而且主要的GC都在这个空间上工作,它应该扫描所有内存并标记不再具有任何引用的对象以进一步清除。

在您的情况下,您正在加载的测试数据量将流向旧空间。结果,它会在整个测试过程中影响主要的GC。在这种情况下,主要的GC不会清除太多,因为您正在使用测试对象,但是它仍然会花费时间来扫描整个旧空间。因此,您可以考虑通过启动带有gc专用标志的节点来阻止v8这样做,例如:--nouse-idle-notification --expose-gc --gc_interval=100500(其中100500是分配数,它可能取高值,将阻止整个测试通过之前运行gc)这将允许手动触发垃圾回收。使用这种方法测试您的代码,看看主要的GC如何对其产生影响,然后尝试使用提供给功能的不同数据量进行测试。如果影响很小,那么您可以尝试重构代码,以尽量减少长期存在的变量,闭包等。

如果您发现主要的GC对性能没有太大影响,那么清理GC将花费大部分时间。与主要的GC不同,它在堆中使用所谓的“新空间”。这是存储所有新对象的空间。如果这些对象幸免于难,则将它们移到旧空间。与旧空间相比,新空间的大小要小得多(可以通过设置--max_semi_space_size,注意:new space size = 2 * semi space size来控制它),并且分配更多清除GC运行的新对象和变量也会更多。如果此GC过度提高了性能,则您可以考虑重构代码以减少新的分配。但是,如果您将重用变量,则可能还会降低性能,并且这些对象将移至旧空间,并且可能会成为“主要GC”部分所述的问题。

v8 GC也不总是在程序运行的同一线程中工作。它也可以在后台执行某些工作,但是我不知道Webstorm在您的案例中显示了什么。如果仅计算在GC上花费的总时间,可能只是影响不大。 您可以在此blog post中找到有关v8 GC的更多详细信息。

TL; DR:

  

GC开销可以减少吗?

  • 是的,但是首先您应该发现应该通过上述步骤进行优化的地方。
  

这是刚刚分配的金额吗?

  • 可以通过比较不同的方法来发现这一点。没有绝对的数字可以限制“好”数量和“坏”数量,因为它取决于很多因素,包括录入数据的数量。
  

是否可以获得更好的内存配置信息?

  • 您可能会找到一些不错的工具here,但一般来说,您可能会使用Chrome开发者工具,它们提供的details比Webstorm还要多。