我的应用在Heroku上运行,使用了5个并行dyno。服务器不断承载500-1500次请求/分钟,即每秒最多25个请求。问题是RSS内存不断增长。目前当内存达到危险水平(1个Heroku dyno使用的最大内存为512mb)时,我会手动重启应用程序。内存图表如下(上方灰色轴位于512mb限制处):
奇怪的是,只有在服务器不断承载负载时才会发生这种情况。例如,当服务器负载持续2分钟时,内存会增加,之后又会下降。因此,似乎垃圾收集器无法正常工作(直到服务器负载完成且应用程序不再繁忙之前,它都不会清除垃圾)。
我能做些什么呢?我认为这不是内存泄漏,因为当服务器没有负载时,内存会被释放...
我尝试过的方法是:
Node版本是
我使用了node的
奇怪的是,只有在服务器不断承载负载时才会发生这种情况。例如,当服务器负载持续2分钟时,内存会增加,之后又会下降。因此,似乎垃圾收集器无法正常工作(直到服务器负载完成且应用程序不再繁忙之前,它都不会清除垃圾)。
我能做些什么呢?我认为这不是内存泄漏,因为当服务器没有负载时,内存会被释放...
我尝试过的方法是:
- 每2分钟手动调用GC
- 设置--max-old-space-size = 300,但是当内存达到300MB时什么也没发生 - 它仍在增加。
Node版本是
0.10.20
。
我使用了node的
memwatch
包,并成功从应用程序中收集堆差异:
- http://jsonfiddle.net/auf8d(11分钟之间的堆差异,+37 MB)
- http://jsonfiddle.net/4nvcd(15分钟之间的堆差异,+50 MB)
...
{
"what": "Array",
"size_bytes": 9320312,
"size": "8.89 mb",
"+": 79086,
"-": 10215
},
...
{
"what": "Closure",
"size_bytes": 2638224,
"size": "2.52 mb",
"+": 36826,
"-": 184
},
{
"what": "Native",
"size_bytes": 21471232,
"size": "20.48 mb",
"+": 546,
"-": 0
},
{
"what": "String",
"size_bytes": 2068264,
"size": "1.97 mb",
"+": 36968,
"-": 1223
},
...
什么是Native
对象(它分配了20mb的内存!)?你能给我建议,如何调查到底是什么导致了内存泄漏吗?