如果我的nodejs内存达到1.5GB,然后我没有对它施加任何负载,系统空闲30分钟,那么垃圾收集器也没有释放内存
答案 0 :(得分:1)
不可能说出任何具体的内容,例如"为什么gc没有收集垃圾"正如你在评论中提到的那样,当你什么都没说,你的程序在做什么或代码是什么样的。
我只能向您指出GC如何在Node中工作,并解释如何手动运行GC以查看是否有帮助。当您使用--expose-gc
标志运行节点时,您可以使用:
global.gc();
你的代码中的。您可以尝试在超时,定期间隔或任何其他特定时刻运行该代码,看看是否可以释放您的内存。如果确实如此,那就意味着GC确实没有运行,那就是问题所在。如果这并没有释放你的记忆,这可能意味着问题不在于GC没有运行,而是无法释放任何东西。
手动GC调用后内存未被释放意味着您有一些内存泄漏或者您使用了无法通过GC释放的大量内存。
如果在手动运行GC后释放内存,则可能意味着它本身没有运行,可能是因为您正在执行一个非常长的阻塞操作,该操作不会给事件循环任何运行机会。例如,长时间运行for
或while
循环可能会产生这样的效果。
不了解您的代码或其功能,因此无法为您的问题提供更具体的解决方案。
如果您想知道节点中GC的工作方式和时间,那么网上有一些很好的文档。
StrongLoop有一篇关于GC如何运作的好文章:
Daniel Khan的这篇文章值得一读:
GC可能正在运行,但由于内存泄漏,它无法释放任何内存。如果没有看到实际的代码,或者甚至没有看到它的作用,那么它就不可能多说了。