首页 > 解决方案 > 你能发现这个 node.js 函数中的内存泄漏吗?

问题描述

我部署的应用程序有一个函数,可以在调用app.get("/")路由时调用数据库,或者当用户向数据库添加或删除文件时。调用此函数时,我的 Web 主机限制了我的服务,因为它超出了我的内存分配,导致我的一个 npm 包(尖锐)出现故障,没有可用于处理图像的处理器线程。

我研究了我的网络主机提供的指标,但除了告诉我发生了故障外,它并没有显示内存使用量有多大或在哪里。使用 Chrome DevTools 任务管理器,我可以看到实时 javascript 内存实际上确实在应用程序的运行时缓慢增加,但并不比我看过的其他网页多。

我在该领域没有导师,在对内存泄漏、导致它们的原因以及如何解决它们进行了详尽的研究之后,我感到迷茫和困惑,但我确实相信我已经将其缩小到了问题。我只是不知道从这里做什么。

这是有问题的功能:

let artWorks = [];

async function listFiles() {
  artWorks = [];   //clears the array if it has content
  const [files] = await storage.bucket(bucketName).getFiles();    //call for url names of files in DB
  files.forEach(file => {   //loops through all files and pushes them to the array, separating the URL string into usable data
    function splitStr(str) {
      var string = str.split("/");
      artWorks.push(
        {
          imgCategory: string[0],
          subCat: string[1].replace(/-/g, ' '),
          imgSrc: bucket + file.name,
          thumbnail: thumbBucket + file.name.split('.')[0] + "-thumb.jpg",
          alt: string[2]
        });
    }
    var str = file.name;
    splitStr(str);
  });
  console.log("files listed");
}

artWorks数组是整个应用程序的关键。每个路由都使用这个数组的内容来填充 ejs 模板页面。用户添加或删除文件后,将listFiles()再次调用该函数以重新填充数组。

我没有注意到性能有任何下降,如果不是因为我的网络主机限制了我的内存,我永远不会知道有泄漏。请给我指导,希望不要过多地涉及术语,但是像我这样的新开发人员可以理解的术语。

标签: javascriptnode.jsmemory-leaksheap-memoryheap-dump

解决方案


splitStr请注意,您在每次迭代中都声明了该函数。我给你写了一个小建议,让你以更简洁的方式阅读这段代码。

希望你会喜欢。

 const filesMapper = ({name}) => {
    const string = name.split('/')
    return { 
       imgCategory: string[0],
       subCat: string[1].replace(/-/g, ' '),
       imgSrc: bucket + name,
       thumbnail: thumbBucket + name.split('.')[0] + "-thumb.jpg",
       alt: string[2]
    }
}

async function listFiles() {
    const [files] = await storage.bucket(bucketName).getFiles(); 

    return files.map(filesMapper)
  });
}

推荐阅读