Tag: 垃圾收集

Node.js和V8垃圾收集

以下是我目前阅读的内容,如果我错了,请纠正我的错误: Node.js基于V8 JavaScript引擎。 V8 JavaScript引擎实现世界各地的垃圾收集 这导致Node.js有时会完全closures几秒到几分钟来处理垃圾收集。 如果这是针对生产代码运行的,那么对于10,000个用户来说这是几秒钟。 在生产环境中真的可以接受吗?

如何避免在清除gc期间快速增加内存?

我有一个build立在restify上的应用程序。 我没有内存泄漏,但是在清除gc的时候我有很大的内存增长,于是重力扫描gc并清理内存。 它影响我的应用程序的性能。 [2268] 266859 ms: Scavenge 61.5 (119.5) -> 46.0 (119.5) MB, 2.2 ms [allocation failure]. [2268] 267084 ms: Scavenge 63.7 (119.5) -> 48.3 (119.5) MB, 6.2 ms [allocation failure]. [2268] 267289 ms: Scavenge 66.0 (119.5) -> 50.6 (119.5) MB, 2.6 ms [allocation failure]. [2268] 267504 ms: Scavenge 68.3 (119.5) -> 52.8 (119.5) MB, […]

nodejs垃圾收集输出

任何人都知道我在哪里可以阅读关于nodejs中的–trace-gc选项的输出? 我不是要求解释gc是如何工作的,因为有很多关于它的信息,只是为了–trace-gc的输出。 我可以猜到一些领域的意义,但我不知道其他的。 例如 : 括号内数字的含义是什么, “步”meaining(这可能涉及到增量标记和懒惰扫) 写入的堆的大小是整个堆? (增加年轻人和老年人) … 一个例子 : [12994] 77042 ms: Scavenge 260.7 (298.1) -> 247.7 (298.1) MB, 9.4 ms [allocation failure]. [12994] 77188 ms: Scavenge 261.7 (298.1) -> 249.0 (300.1) MB, 7.4 ms [allocation failure]. [12994] 77391 ms: Scavenge 263.8 (301.1) -> 250.6 (302.1) MB, 8.1 ms [allocation failure]. [12994] […]

nodejs减less了v8垃圾收集器的内存使用量

我正在使用util模块debuggingnodejs应用程序,而heapUsed值保持在30-100MB左右, heapTotal值增长到1.4GB。 这是一个关于类似行为的问题 我读过,这是如何V8垃圾收集器的行为方式,但问题是如何减less它分配的内存量(使其小于1.4GB),例如,如果在512 MB设备上运行例如

禁用node.js垃圾回收一段时间

在执行一些对延迟敏感的代码时,是否有任何方法可以在指定的时间段内明确禁用GC运行(至less大部分耗时的运行,比如旧空间中的GC中断)? 像这样的东西: disableGc(); runCodeWithoutDelays(); enableGc(); 大概使用一些节点选项,或本地模块? 或者我可以编写自己的模块,V8中是否有API?

Node.js(v8)垃圾收集器如何工作?

我已经做了一些testing与我的node.js应用程序寻找内存泄漏,我的代码应该做的。 我运行的脚本,在我看来应该泄漏内存,但我感到惊讶的结果。 redisClient.on('message', initRequest); function onSuccess(self, json){ console.dir(json); } function initRequest(channel, message){ var request = new RequestObject({ redisMessage: message }); request.on('success', onSuccess); } redisClient每秒发出几个“消息”事件。 这意味着initRequest函数经常被调用。 每次request对象在内存中创build时,函数onSuccess绑定到它的“成功”事件。 我假设(但在这里我可能是错的),只要有监听器(在这种情况下的onSuccess )绑定到这个对象,它不能被垃圾收集。 然后我想,内存使用量将会增长,因为内存不会被释放。 作为这个潜在的泄漏的解决scheme,我想使用.once而不是.on ,因为这将解除绑定的监听器和对象可以被垃圾收集。 我用pmap来testing两种情况(比较.on和.once以及另外一个不值得提的场景),而且我没有发现很大的差别。 总结我有两个问题: 这是正常的GC行为来清除内存在一定的时间间隔,或者它达到一些threashold而不是连续清理? 我正确地认为,与.on示例代码应该泄漏内存, .on我没有看到内存消耗图吗?

node.js / Express在高负载下抛出'RangeError:超出最大调用堆栈大小'

我们在高负载下运行的节点环境出现了一个问题,我们无法find源。 有一点背景:我们使用Express来为http框架运行一个集群节点应用程序。 目前有3个盒子,每个盒子有8个CPU核心,每个盒子都有6个节点的工作人员。 设置似乎很好,我研究了所有build议的方法,我相信这个设置是可靠的。 我们使用Express 2.5.11和XMLHttpRequest 1.4.2运行node.js 0.8.1。 问题在于:我们正在对该产品进行“黑暗启动”testing(即浏览器客户端代码在后台调用了API ajax API,但未在页面上使用或向用户显示)。 几分钟运行成功后,系统抛出: [RangeError: Maximum call stack size exceeded] 我们通过集群控制器中的“uncaughtException”事件捕获错误(启动每个工作者),但是在该级别没有可用的堆栈跟踪。 我已经在这个问题上进行了广泛的研究,似乎无法find有类似错误的人。 在梳理系统中的每一行代码之后,下面是我所知道的: 我找不到任何recursion或循环引用。 (我读过这个错误并不总是意味着recursion问题,但是我们已经检查过;实际上我们已经通过去除大部分代码来运行testing,它仍然会发生,见下文)。 我已经下了一个工作进程每箱试图消除集群作为一个问题 – 问题仍然存在; 这个问题只发生在高负荷下。 我们的stream量是约。 每秒1500页,在交通繁忙的时候,可以达到每秒15000页(我们无法在开发环境中复制)。 发现错误的时间不同,但通常在15分钟内。 错误似乎不影响操作! 我的意思是没有腐败的反应,除了偶尔的超时之外,系统不会崩溃; 陷阱错误的工作进程恢复并在几秒钟后重新开始服务请求; 我得到了最基本的devise上的错误 – 没有额外的API被称为。 只需要一个请求,并用简单的json响应来回应。 这是最奇怪的部分。 看起来系统在我的任何代码中都没有失败 – 没有实例化任何类来做真正的工作,这是失败的。 很显然,我从更多的代码开始,但是慢慢地拿出了一些代码,直到在一个简单的设置下仍然失败。 我相信最明显的症状是错误总是在请求被完全服务之后发生。 也就是说,服务器接受请求,find正确的Express路由,调用res.send,并完成。 这真的感觉就像垃圾收集给我! 我已经读过V8引擎有一个非常好的GC引擎,但是我想知道我们的重负载影响了多less。 正如我所说,即使在基本devise上,代码也会抛出错误。 取出了我们大部分的自定义代码,这是设置的基础。 对不起,我在这里切,所以不是所有的variables声明等将被包括,但代码的工作,所有的东西都在真正的代码: 群集控制器。 这是在命令行上启动的清理版本。 cluster = require('cluster'); path […]

如何在Node.js / V8中debugging/分析非常长的GC暂停

我正在尝试在相对复杂的Node.js服务器应用程序中分析内存/ GC问题。 即使在非常适中的负荷下,它们在明显的时期也变得没有响应,而这些停顿随着时间的推移而变长。 使用–trace-gc参数运行可能会导致非常长的垃圾收集时间: [4805] 537 ms: Mark-sweep 17.6 (46.4) -> 10.3 (47.4) MB, 20 ms [allocation failure] [GC in old space requested]. [4805] 1338 ms: Mark-sweep 31.3 (58.4) -> 19.2 (57.2) MB, 40 ms [allocation failure] [promotion limit reached]. [4805] 2662 ms: Mark-sweep 58.0 (79.2) -> 43.9 (85.2) MB, 109 ms [Runtime::PerformGC] [promotion limit […]

configurationv8的内存pipe理对于node.js进程来说是明智的

我们在node.js上运行一台XMPP服务器,这台服务器的内存大约为3.8 GB。 以下是我们在调用节点时传递的命令行参数:/ opt / node / bin / node –max-old-space-size = 3000 –trace-gc –trace -gc-verbose main.js 但是,我们经常需要在这个过程中看到超过10秒的gc暂停(有时甚至超过1分钟gc暂停,我们的服务器除了运行GC之外什么都不做)。 发生这种情况时,我们的过程就是正常的内存消耗:大约1 GB的堆使用率。 这个过程大约有2GB或者可用空间,但是这个过程并没有使用它,花了一分钟的时间来释放内存。 看看由-trace-gc-verbose选项给出的gc trace,看起来大约有2 GB的可用空间被标记为“大对象空间”,并没有被使用,因为没有那么多的大对象。 虽然这个过程迫切需要更多的“旧指针”和“旧数据空间”的内存,但是这个“大对象空间”中的空闲内存没有被使用。 这是gc在这个过程中长时间停顿的时间之一留下的痕迹: 91635809 ms:标记扫描968.8(1039.0) – > 958.5(1038.0)MB,1/410 ms(自标记开始以来的79个步骤中+ 2287 ms,最大步骤140.227051 ms)[idle notification:finalize incremental]请求的空间]。 内存分配器,使用:1088446464,可用:2124390400 新的空间,使用:192,可用:8388416 老指针,使用:633992112,可用:10460240,浪费:0 旧的数据空间,使用:315819248,可用:149776,浪费:0 代码空间,使用:5867936,可用:1271392,浪费:0 使用的地图空间:10257976,可用:6384072,浪费:0 单元格空间使用:175936,可用:954304,浪费:0 大对象空间,使用:51413600,可用:2123325184 91636499 ms:清除965.5(1038.0) – > 964.6(1038.0)MB,17 ms(从上次GC开始的10个步骤中为+ 109 ms)[Runtime :: PerformGC]。 […]

将对象的所有键都变成小写的最好方法是什么(最有效)?

我已经想出来了 function keysToLowerCase (obj) { var keys = Object.keys(obj); var n = keys.length; while (n–) { var key = keys[n]; // "cache" it, for less lookups to the array if (key !== key.toLowerCase()) { // might already be in its lower case version obj[key.toLowerCase()] = obj[key] // swap the value to a new lower case […]