我一直在使用appmetrics监控节点js app中的GC。我每隔几秒就会看到一次小型GC事件。这是正常的吗?此外,我已将内存设置为2 GB,但日志显示只使用了大约80-90 MB的堆。
来自应用指标的示例日志:
{"time":1523390469898,"type":"S","size":81068032,"used":44745080,"duration":3}
{"time":1523390678028,"type":"M","size":88408064,"used":35710552,"duration":2}
答案 0 :(得分:0)
取决于你的代码和创建了多少垃圾,但垃圾收集调用每隔几秒是很正常的,因为默认的JS代码通常会不断创建对象。如果您遇到GC问题,请尝试减少对象分配,并在需要时修改其属性。
此外,将内存设置为2 GB并不意味着它将分配2 GB。这意味着它会在需要时将UP分配到2 GB,但不会超过。
答案 1 :(得分:0)
小型/清除垃圾收集器的设计目标是run regularly and be very fast。几乎在所有情况下都不到10毫秒,实际上通常快1毫秒,而对于你的例子,它似乎是3毫秒。它非常快,因为它只运行在自上次清除垃圾收集以来包含新分配项目的一小部分内存中。
它通常与您使用的最大堆大小有多少相关,因为这些事件主要与管理较旧,持久性较长的其他垃圾收集算法(标记和扫描)相关联。引用。
这个小型GC由许多东西(包括一些启发式)触发,这些东西很难准确确定触发它的是什么,但实际上每几秒钟都没有什么值得关注的,因为它只是阻塞持续1-10ms。在高负载应用程序下,它实际上会更频繁地运行。