javascript - 奇怪的 Nodejs 内存泄漏
问题描述
嘿,我在 Heroku 中托管的 nodejs 服务器上遇到了奇怪的内存泄漏。我试图找到泄漏两天,在我一个一个删除我的功能后,我发现这个导致了问题,但我仍然不确定问题到底出在哪里。我可以清楚地看到 heroku 指标存在内存泄漏。 有人知道为什么这个函数会产生内存泄漏。谢谢
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
. 由于连接池大小限制,是否会以某种方式受到限制,即排队或阻塞请求。
如果函数调用的数量超过可用资源/连接的数量,您将开始看到内存使用量逐渐增加。
不是说这是原因,但它绝对是我要开始寻找的地方。
推荐阅读
- r - 如何使用 R 从日/月/年日期格式中保留月/年
- javascript - 将点击事件函数应用于多个元素,包括 if/else
- python - Matplotlib 如何获取子图(轴)之间的间隙和空白距离
- python - Numpy 数组的 Windows 和 Ubuntu 之间的内存使用差异
- python - 获取pocketsphinx字符串
- android - 使用 expo 生成的 Apk 安装时不要求权限
- oauth-2.0 - JWT Same Application 是 Auth Server 和 Application Server
- r - 在数据框中,如何将大量条目的值作为元素相加?
- regex - 拆分功能问题
- .net - 从 Sap.Data.Hana.HanaDataRader 获取字段名称