内存泄漏:在Linux中使用Node JS下载文件会导致内存泄漏

时间:2014-02-06 13:50:57

标签: node.js memory-leaks out-of-memory v8 node-ffi

我正在使用node.js(v0.10.22)并表达模块并向用户提供下载文件功能。 我们每个请求平均下载50个文件,平均大小约为700 MB。 我们有自己的C程序,它在运行时编写这些文件,子进程将这些文件同步发送给用户。

我们正在使用FFI模块来调用C函数。我面临的问题是node.js增加了虚拟内存,它也没有释放大量使用的内存。下载后会出现ENOMEM错误&崩溃。我的PC H / W配置是1 GHZ单核处理器和512 MB RAM。这里的问题是为什么V8在每个请求之后不释放内存或者是否存在节点/ V8所需的任何特殊编译。我们用Valgrind测试了我们的c程序,它没有显示任何内存泄漏。

async.series([
  function DecryptFile(cb) {
    logger.debug("call decrypting Function for========="+param);
    var childProc = cp.fork(__dirname + '/child.js');

    childProc.on('message', function(m) {
    logger.debug('PARENT got message:', m.timestamp);
    decFile=m.timestamp;
    if(decFile){
      if(bluetoothReq){
        res.send(conf.get('contentTempFile')+decFile+"/"+ fName);
        return;
      }else{
        logger.debug("downloading for device : "+param);
        var folderPath=conf.get('contentTempFile')+decFile;
        var downloadPath = path.join(folderPath, fName);
        stats = fs.lstatSync(downloadPath);
        if(stats.isFile()) {
          res.download(downloadPath,fName, function(err){
          if (err) {
            // handle error, keep in mind the response may be partially-sent
            // so check res.headerSent
            logger.debug("res Error :");
            console.log("res Error :");
          } else {
            // decrement a download credit etc
            logger.debug("res Successfull :");
            console.log("res Successfull :");
          }
          logger.debug("res on End :");
          rmdir(folderPath, function(error){
          logger.debug("content download Succefully :"+downloadPath);
          console.log("delete Folder Successfull :"+downloadPath);
          if(error){
            logger.debug('rm -rf '+folderPath);
            exec('rm -rf '+folderPath);
          }
       });
     });
   }
  }
  }else{
    statsLogger.addStats(req,statsCode.TYPE_ERROR_DOWNLOAD,contentId,content.title+"-"+fileName);
    res.send("1,Problem while Downloading ");
  }
  childProc.kill();
  });
  childProc.send({ filePath : folderName+ fileName,
  temp      : conf.get('contentTempFile'),
  timestamp : timestamp,
  fName     : fName });

0 个答案:

没有答案