我们在云服务器上运行了一个 Nodejs 服务,只给它 512MB RAM(对于应用程序来说绰绰有余)。
服务器的内存使用量缓慢增长。当读取到512MB内存限制时,服务器会自动重新启动。
我尝试通过大量负载测试来读取内存使用统计信息,该数字显示缓慢增长rss memory usage,但非常稳定低heap memory usage。
我尝试过--max_old_space_size,但这只会限制堆大小,这对我来说从来都不是问题。堆大小读取始终低于 50MB。
有办法限制rss memory size吗?
rss一些快速研究表明和之间的区别heap是 C++ 代码的缓冲区大小。不确定是否可以调试它们(gdb?)。
有人说 v8 有 1.4GB 的限制,这也是堆大小限制吗?如果是rss限制,也许我可以修改nodejs源代码,构建一个限制更小的特殊版本?
我--expose-gc经常尝试清理GC,但同样,这只有助于堆使用(并减慢它的速度)。
更新:找到了原因,RSS 使用量不断增长是由于我们使用的库之一的 C++ 内存泄漏(谢谢bignum)。避免使用它可以保持 rss 内存稳定。
在编写 ReactJS 组件时,我发现子组件有时会丢失状态。事实证明,如果子组件使用不同的渲染函数渲染,就会发生这种情况。
IE
父组件有 2 个子渲染函数,根据不同的条件,它要么在主体中渲染子组件,要么在标头中渲染子组件。
...
renderInHeader = () => (<Header><ChildComponent /></Header>);
renderInBody = () => (<Body><ChildComponent /><Body>);
render = () => {
if (somethingHappens) {
return this.renderInHeader();
}
return this.renderInBody();
}
...
Run Code Online (Sandbox Code Playgroud)
这意味着,当 时somethingHappens,它将使用不同的渲染函数来渲染ChildComponent.
那么,ChildComponent就会失去它的状态。(子组件的状态被重置)。
我理解为什么会发生这种情况,实际上我有点惊讶孩子的状态没有更频繁地重置(即每次父级重新渲染该节点时重置)。
然而,处理这个问题的理想解决方案是什么?
避免在子组件中使用状态?(因为不能保证安全?)
key=给ChildComponent一个a ,这样在重新渲染的时候就可以把它当作一个独立的节点了?(不确定是否key可以在映射器之外工作)
使用ref?(不知道是否可以这样工作)
使用 React 16 中的新“Portal”?(还没试过)
注意:我知道我可以使用变量 forHeader和Body,所以只需要一个渲染函数。然而,现实世界的情况可能更复杂,可能有多个子组件分布在不同的区域。
IE
...
renderInBody = () => (
<Body>
<Header>
<ChildComponent1 />
<ChildComponent2 />
</Header>
<ChildComponent3 …Run Code Online (Sandbox Code Playgroud)