javascript - 奇怪的 Nodejs 内存泄漏

标签 javascript node.js express memory-leaks

嘿,我在 Heroku 中托管的 nodejs 服务器上遇到了奇怪的内存泄漏。
我试图找到泄漏两天,在我一个一个删除我的功能后,我发现这个导致了问题,但我仍然不确定问题到底出在哪里。
我可以清楚地看到 heroku 指标存在内存泄漏。
enter image description here
有人知道为什么这个函数会产生内存泄漏。谢谢

completeTicTacToeGame: function (game, winnerIndex, reasonForFinish, userId) {
    if (userId) {
      User.findOne({
        _id: userId
      }, function (err, user) {

        if (err || user == null) {
        }
        else {
          userLivesController.removeUserHeartWithoutResponeAndSaving(user, 'ticTacToeHearts', function (user, canPlay) {
            if (canPlay) {
              dateFormatterController.checkIfDateIsToday(user.lastCompitedTicTacToeGame, function (isToday, isPrevious) {
                var earnCredits = 0
                if (winnerIndex == 0) { earnCredits = 1 }
                if (winnerIndex == 1) { earnCredits = 4 }

                user.credits = user.credits + earnCredits
                user.lifetimeCredits = user.lifetimeCredits + earnCredits


                //increase ad today counter
                user.lastCompitedTicTacToeGame = (new Date()).getTime().toString()

                userBadgesController.checkIfUserNeedToWinBadgeForCredits(user, function (user) {

                  user.save(function (err, user) {
                    if (err) {
                      errorHandlingController.generalSendErrorWithMessage(req, res, 'serverError')
                    }
                    else {
                      var canPlayMoreGames = user.ticTacToeHearts > 0
                      if (earnCredits > 0) {
                        notificationController.sendNotificationToUserForNewTicTacToeGame(user, earnCredits)
                        rankingController.updateRankings(user, earnCredits, 'ticTacToe')
                      }

                      var canWatchAdToDoubleCredits = false
                      if (user.gamesWithoutAd >= ConfigParams.numberOfGamesForAd() && earnCredits > 0) {
                        canWatchAdToDoubleCredits = true
                      }
                      var timeLeftToNextHeart = (((ConfigParams.minutesForHeart() * 60000)) + parseInt(user.lastGivenHeart)) - ((new Date()).getTime())

                      var haveMaxHearts = user.mathGameHearts == ConfigParams.maxHearts() && user.memoryHearts == ConfigParams.maxHearts() && user.ticTacToeHearts == ConfigParams.maxHearts()
                      var canWatchVideoForHeart = true && haveMaxHearts == false
                      if (user.lastWatchedVideoForHeart) {
                        var canWatchVideoForHeart = (((ConfigParams.minutesForHeartWatchedAd() * 60000)) + parseInt(user.lastWatchedVideoForHeart)) - ((new Date()).getTime()) < 0 && haveMaxHearts == false
                      }

                      module.exports.sendMessageToSocketForComlitedGame(game, user._id.toString(), user.credits, earnCredits, canPlayMoreGames, canWatchAdToDoubleCredits, reasonForFinish, user.ticTacToeHearts, ConfigParams.maxHearts, null, user.gamesWithoutAd >= ConfigParams.numberOfGamesForAd() - 1, timeLeftToNextHeart, canWatchVideoForHeart)
                    }
                  })
                })
              })
            }
            else {
              var timeLeftToNextHeart = (((ConfigParams.minutesForHeart() * 60000)) + parseInt(user.lastGivenHeart)) - ((new Date()).getTime())

              var haveMaxHearts = user.mathGameHearts == ConfigParams.maxHearts() && user.memoryHearts == ConfigParams.maxHearts() && user.ticTacToeHearts == ConfigParams.maxHearts()
              var canWatchVideoForHeart = true && haveMaxHearts == false
              if (user.lastWatchedVideoForHeart) {
                var canWatchVideoForHeart = (((ConfigParams.minutesForHeartWatchedAd() * 60000)) + parseInt(user.lastWatchedVideoForHeart)) - ((new Date()).getTime()) < 0 && haveMaxHearts == false
              }

              module.exports.sendMessageToSocketForComlitedGame(game, user._id.toString(), user.credits, 0, false, false, reasonForFinish, user.ticTacToeHearts, ConfigParams.maxHearts, null, user.gamesWithoutAd >= ConfigParams.numberOfGamesForAd() - 1, timeLeftToNextHeart, canWatchVideoForHeart)
            }
          })
        }
      })
    }
  },

最佳答案

就像其他人在这里评论一样,通过查看代码很难找到明显的原因。
您应该查看的一件事可能是在您的应用程序中调用此函数的频率。您调用 User.findOne .是否会因连接池大小限制而以某种方式受到限制,即排队或阻塞请求。
如果函数调用多于可用资源/连接
您将开始看到内存使用量逐渐增加。
不是说这是原因,但它绝对是我要开始寻找的地方。

关于javascript - 奇怪的 Nodejs 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63661738/

相关文章:

javascript - 使用 JavaScript 添加和删除类

javascript - Hapi.js、Bookshelf.js 和一个真实世界的例子

动态选项卡中的 Javascript 计算总计

javascript - 根据页面 URL 更新类属性

javascript - Node.js - foreach 内的 mysql 查询

express - 如何等待所有异步调用完成

javascript - 如何传递一个类并调用一个类的函数javascript

node.js - 使用express-sessions和passport.js检索以前的登录信息

javascript - 在 reactjs 中处理多个 ajax 调用

javascript - Discord.js:如何获取对带有特定表情符号的消息使用react的所有用户,然后将用户列表设置为变量?