代码之家  ›  专栏  ›  技术社区  ›  Tom

对象内存泄漏(当nodejs配置为最大512M时,Heroku的内存使用率为1.5 GB)

  •  3
  • Tom  · 技术社区  · 6 年前

    代码非常简单,应该可以从内存中释放对象,这个应用程序中大约有20个并发用户。

    代码的思想是sessionID是存储对象的键,当会话结束时,对象被释放。

    密码

    'use strict'
    const http = require('http')
    const app = require('./config')
    const Server = http.Server(app)
    const PORT = process.env.PORT || 8000
    const io = require('socket.io')(Server)
    
    Server.listen(PORT, () => console.log('Game server running on:', PORT))
    
    const players = {}
    const moneys = {} 
    
    var util = require('util');
    
    io.on('connection', socket => {
        // When a player connects
        socket.on('new-player', state => {
        //console.log(socket.id+'New player joined with state:', state)
        players[socket.id] = state
        // Emit the update-players method in the client side
        io.emit('update-players', players)
    
        var pCount = Object.keys(players).length;
        console.log("players in mem "+pCount);      
      });
    
       socket.on('new-money', state => {
          moneycounter++
          moneys[socket.id] = state
          // Emit the update-players method in the client side
          if (moneycounter >2) {
              io.emit('update-moneys', moneys)
              moneycounter = 0
          }
      });
    
      socket.on('disconnect', state => {
          console.log(socket.id+' player discontinue with state:', state)
    
        try {
            if (typeof players[socket.id].playerName != 'undefined') delete players[socket.id].playerName
            if (typeof players[socket.id].speed != 'undefined') delete players[socket.id].speed
        }
        catch (err) {
            console.log(socket.id+' typeerror deleting 1')
        }
        delete players[socket.id]
        delete moneys[socket.id]
         //  io.emit('update-players', players)
      });
    
      // When a player moves
      socket.on('move-player', data => {
        //console.log(' move player' +socket.id)
        const { x, y, angle, playerName, speed } = data
    
        // If the player is invalid, return
        if (players[socket.id] === undefined) {
           console.log(socket.id+' invalid move')
    
          try {
             if (typeof players[socket.id].playerName != 'undefined') delete players[socket.id].playerName
             if (typeof players[socket.id].speed != 'undefined') delete players[socket.id].speed
           }
           catch (err) {
              console.log(socket.id+' typeerror 3 deleting')
           }
    
           delete players[socket.id]
           delete moneys[socket.id]
           socket.disconnect();
           return
        }
    
        // Update the player's data if he moved
        players[socket.id].x = x
        players[socket.id].y = y
        players[socket.id].angle = angle
        players[socket.id].playerName = {
          name: playerName.name,
          x: playerName.x,
          y: playerName.y
        }
        players[socket.id].speed = {
          value: speed.value,
          x: speed.x,
          y: speed.y
        }
    
        // Send the data back to the client
        io.emit('update-players', players)
      })
    })
    

    出于某种原因,我的应用程序需要20mb内存 但当天晚些时候超过1.5GB,导致内存R14错误。

    heroku 2hours log

    我的配置应将其限制为512,如下所示:

    web节点--针对大小优化\u--最大\u old\u space\u size=460 --gc\U间隔=100服务器/索引。js公司

    我当前的配置是2倍。(1024 mb计划)

    是否有配置heroku以在发生内存错误R14时重新启动的选项。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Abhishek Singh    6 年前

    您可以使用 node-memwatch 用于监视内存泄漏的软件包,当出现内存泄漏时,可以从代码本身重新启动应用程序。

    Restart a node.js app from code level