javascript – Node.js虚拟内存在使用子进程时不断增加
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – Node.js虚拟内存在使用子进程时不断增加,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2108字,纯文字阅读大概需要4分钟。
内容图文
我正在使用spawn-child npm包来生成一个shell,我运行一个最初在C上构建的二进制文件.我为二进制文件提供了Stdin,然后二进制文件将每秒发送一次Stdout.在节点部分,一旦我开始从二进制文件接收Stdout,我就有一个on listener,看起来像stdout.on(‘data’,function(data){}),我将这些数据发送到SSE通道.
一切都运行良好,但主要关注的是节点进程的持续内存增长,我看到每当我用Stdin命中二进制时.我已经概述了我的代码看起来如何,是否有一种优雅的方式来控制这种内存增长,如果是这样请分享.
var sseChannel = require('sse-channel'),
spawnCommand = require('spawn-command'),
cmd = 'path to the binary file',
globalArray = [],
uuid = require('uuid');
module.exports = function(app) {
var child = spawnCommand(cmd),
privateChannel = new sseChannel({
historySize: 0,
cors: {
origins: ['*']
},
pingInterval: 15 * 1000,
jsonEncode: false
});
srvc = {
get: function(req, res) {
globalArray[uuid.v4()] = res;
child.stdin.write('a json object in a format that is expected by binary' + '\n'); // req.query.<queryVal>
child.stdout.on('data', function(data) {
privateChannel.send(JSON.stringify(data));
});
},
delete: function(sessionID) {
var response = globalArray[sessionID];
privateChannel.removeClient(response);
response.end();
delete globalArray[sessionID];
}
}
}
这段代码只是为了枚举它在应用程序中的外观.在这种情况下,点击运行代码段不起作用.
我以2个不同的间隔收集了heapdump,这就是统计数据的外观,Typed Array值有了很大的增长,可以做些什么来维持或抑制Typed Array的增长,
解决方法:
问题是你产生一个进程一次,然后为你的http服务器的每个请求添加一个新的数据事件处理程序,永远不会被删除.所以这可以解释为什么即使在gc之后内存使用量也不会下降.
另一个(无关的)问题是,如果您使用单个子进程处理多个传入请求,则可能会遇到混合不同请求的响应的问题(您不能假设一个数据事件仅包含特定请求的数据) ).如果子进程是基于node.js的,您可以使用它设置ipc通道,然后只是来回传递常规JavaScript值,而不是设置stdout处理/解析.如果子节点不是基于node.js的,或者您想要一个替代(no-ipc)解决方案,则可以设置一个队列,将所有请求推送到该队列,然后使用一个处理队列并按顺序响应每个请求的函数(只有在您确定已收到子进程的当前请求的所有输出后,才会转到下一个请求).
如果您的子进程仅用于单个请求,则需要调整代码以针对每个请求生成一次(在get()中移动spawn()).
内容总结
以上是互联网集市为您收集整理的javascript – Node.js虚拟内存在使用子进程时不断增加全部内容,希望文章能够帮你解决javascript – Node.js虚拟内存在使用子进程时不断增加所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。