node内存泄露分析 ._pendingList Array

发布于 2022-09-07 23:30:03 字数 1979 浏览 31 评论 0

问题描述

使用egg构建的node应用,node端作为中间服务器,提供服务端渲染,也向服务端请求数据,部署到服务器后,出现内存连续增长的问题,怀疑是内存泄露。

问题出现的环境背景及自己尝试过哪些方法

移除了相关定时器,未解决;

使用alinode监控,取到的堆快照,如下图:

clipboard.png

可以确定主要点在getAllFrontCateInfo这个接口上。
该接口每次都返回一个string的json对象(其实也不是很大),商量后用服务端最后更新时间来判断是否返回新的类目数据,否则使用缓存在node的数据,重新上线后,内存增长速度放慢了很多,但仍旧在上涨。隔段时间再次抓去堆快照,如下图:

clipboard.png

仍然是 ._pendingList Array 和 Request 占据大头,请教是否是请求队列引起的,如果是,需要怎么解决呢

相关代码

// 发起一个请求,是这样的, 用的是[natty-fetch](https://github.com/jias/natty-fetch)
/**
   * @description 从缓存(配置中心)中获取所有可展示前台类目的信息
   * @param {Object} param { timestamp: string }
   * @return {Object} result 接口010206
   */
  async getAllFrontCateInfo(param) {
    try {
      const resp = await fetch.mtop.cat.getAllFrontCateInfo(param);
      return resp;
    } catch (error) {
      this.ctx.logger.error(error);
      this.ctx.redirect('/error');
    }
  }

// controller里面发起请求
// tsp: 时间戳, 获取前台类目的参数,后端根据这个时间戳和类目最后修改的时间进行比较决定是否返回类目数据
let tsp = '0';
let allFrontCateInfo = [];

class HomeController extends Controller {
  async index() {
    const { ctx, config } = this;
    const timestamp = String(new Date().getTime());
    const preTimestamp = String(new Date().getTime());
    let data = await Promise.all([
      ctx.service.home.getAllFrontCateInfo({ data: { timestamp: tsp } }),
      ctx.service.home.***1(),
      ctx.service.home.***2(),
      ctx.service.home.***3(),
      ctx.service.home.***4(),
    ]);

    if (data[0]) {
      tsp = data[0].timestamp || 0;
      allFrontCateInfo = data[0].parentCates.slice(0, 11) || [];
    }

    ctx.body = await ctx.renderView('home', {
      pageletProps: {
        home: {
          allFrontCateInfo,
          ...
        },
      },
    });
    data[0] = null;
    data = null;
  }

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

弱骨蛰伏 2022-09-14 23:30:03

很明显你使用的package本身就有问题或者不是在这种应用场景上使用。(事实上从项目的简介来看,引用场景就很不一样,怎么看都是一个运行在浏览器的项目)

  1. _pendingList没有长度限制,还没成功或失败不释放,也就是为什么你上面有那么多请求在_pendingList上。
  2. storage存储在_pendingList的每个request上,这就是为什么那么大。

natty-fetch/blob/master/src/fetch.js#L141
natty-fetch/blob/master/src/request.js#L16

戈亓 2022-09-14 23:30:03

给的提示代码太少了,比如重要的 _pendingListArray 数组在哪里定义,以及在哪里会 push Request 对象操作的代码都没有,最好加下 alinode 的官方客户钉钉群吧:11794270,可以提供一些技术支持,或者项目邀请下 1012608394995121

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文