我已经在Node.js中编写了一个超级简单的TCP / IP套接字服务器:
'use strict'; var net = require('net'); net.createServer(function (socket) { socket.resume(); socket.once('end',function () { socket.removeAllListeners(); }); }).listen(3000);
once('end',...甚至不必要,但是我想确定,然后从terminal运行以下命令向服务器发送500兆字节的数据:
$ cat 500mb.txt | nc localhost 3000
现在变得有趣了。 我正在使用top观察node进程,并且在OS X和Linux上执行此操作。
当我启动Node.js …
Linux上的Python内存消耗:物理和虚拟内存正在增长,而堆大小保持不变
Linux进程内存消耗(以字节为单位)
如何loggingLinux上的内存消耗?
在WPF重新调整消费
OS X报告MEM 5152K (这似乎很好)
Linux报RES 15180 (我解释为15 MB ,但我不知道这一点)。
那么,只要我跑cat ... | nc ... cat ... | nc ... ,内存使用率上升。 经过一次电话…
OS X报告MEM 20M
Linux报告RES 92320 (这意味着92(!)MB的内存使用量)
这里发生了什么? 为什么Node.js在Linux上比在OS X上使用更多内存? 我的设置错了吗? 我错过了什么吗? …?
最上面的RES值可以通过process.memoryUsage()在Node中检索,然后在RSS值中。 发现这个GitHub回购https://github.com/baryshev/RSS-memory-leak和相应的节点问题https://github.com/joyent/node/issues/4217 。
Linux和Mac OS X的内存管理器是复杂的,为了解决这个过程的内存使用情况,这是一门黑色艺术。
在Linux上,RSS大小是常驻进程大小。 它包括映射的二进制文件和库以及匿名映射的页面(malloc数据)等内容,但不包括未映射的数据,例如当前未映射的二进制文件的部分,已映射出的匿名页面或延迟分配的匿名页面。 即使你的应用程序没有太大的功能,当内存充足时,它也会增长,如果由于不同的进程而产生内存压力,它会缩小。 从程序员的角度来看,这几乎是无用的(但从系统管理员的角度来看非常有用)。
在Mac OS X上,MEM列记录为“内存大小”。 如果不检查top和kernel的源码,就不可能知道它究竟是什么。
总之,只要你的应用程序运行良好,显示的不同值可能不用担心。 虽然查看操作系统提供的值可能对于是否有任何问题是有用的,但是通过查看V8的堆分析器提供的值,您可能会更好地得到服务。
您可能正在体验小牛内存压缩。 (见本页最后一点)
从本质上讲,Mac OSX将压缩它认为“不活跃”的页面来节省空间。 操作系统用来确定“无效”的算法可能是秘密的(虽然我不能证明这是)。 小牛使用的压缩算法是WKdm 。
如果确实如此,OSX可能会认为v8拥有的某些页面在一段时间内还没有被使用,并将其压缩以便为其他程序腾出空间。 即使您拥有可用内存,OSX也会执行此操作,因为它使用的内存不是明确用作将来可能使用的程序代码和数据(也是压缩的)的缓存。
我也不是说,这不是人们不可避免地提出的其他事物的排他性; 分配器和GC之间的差异,V8怪癖等也算,但这当然也很重要。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。