我正在使用nodejs提供的zlib进行一些测试。
当我在一个循环中调用deflate函数5000次时,发生了内存泄漏。在Linux中,brk函数被调用了10000次以上(strace -cfe mmap,munmap,mprotect,brk -p {process ID})。
但是,当我使用setInterval每1秒调用5000次时,没有内存泄漏。并且brk功能在Linux中的发生率要低得多。
在nodejs中,相同的数目称为5000,但是为什么在Linux中brk函数的调用数目不同? 我想这就像在Linux中重用内存空间一样。它是否正确?如果没有,确切原因是什么?
很可能您会看到垃圾收集器的一些副作用。对此进行分析需要比您在此处发布的信息更多的信息,但是,如果我要冒一个有根据的猜测,NodeJS(或通过libuv的v8)可能会在事件循环的底部进行机会GC,至少在其循环中收集垃圾。寿命最短的游泳池。
当您在循环中运行此程序时,您永远不会脱离事件循环,这意味着垃圾回收运行的机会可能会更少。它可能基于计时器或分配计数器运行,并且几乎可以肯定在内存分配器内存不足的情况下运行。
在您的循环中运行它数十万次迭代,我敢打赌它会在某个时候稳定整个进程的分配。