如何解决nodejs 应用程序中的内存泄漏,关于全局变量的建议
我需要在 Nodejs/JS 上调试第一次内存泄漏,所以这里有一些新手问题。我想得到一些关于代码设计的建议......特别是:
我有一个MysqL数据库的连接,我把它作为全局变量打开,这样我就不必建立连接和拆卸了。我有频繁的访问请求。 我已经连接到谷歌服务,同样,在全局级别建立一个连接对象,这样我就不必每次都重新连接并延迟用户。 对于上面的 1 和 2,我应该对内存泄漏有任何负面担忧吗? (相对于在函数范围内调用和拆除它们)
片段:
import MysqL from 'MysqL';
const connection = MysqL.createConnection({
host: 'localhost',user: 'xxxx',password: 'xxx',database: 'xxx',charset: 'utf8mb4'
});
connection.connect((err) => {
if (err) throw err;
console.log('Connected!');
});
...
export {connection as default};
这是另一个:
import config from './config.json';
import discord from 'discord.js';
//discord bot
const bot = new discord.Client();
// We also need to make sure we're attaching the config to the CLIENT so it's accessible everywhere!
bot.config = config;
bot.commands = new discord.Collection();
bot.aliases = new discord.Collection();
bot.help = new discord.Collection();
bot.login(config.token);
export default bot;
和谷歌连接
// Imports the Google Cloud client library
import { TranslationServiceClient } from '@google-cloud/translate';
// instantiate an instance of a connection to google translate API
const translationClient = new TranslationServiceClient();
解决方法
IMO 最好像这样初始化连接,因为在您导出连接时,它并没有建立,这可能会导致不同的问题。
const createMsqlConnection = () => {
return new Promise((resolve,reject) => {
const connection = mysql.createConnection({
host: 'localhost',user: 'xxxx',password: 'xxx',database: 'xxx',charset: 'utf8mb4'
});
connection.connect((err) => {
if (err) reject(err);
console.log('connected')
resolve(connection);
});
})
}
const start = async () => {
const connection = await createMsqlConnection()
// use connection here...
}
start.then()
所以换句话说,与其导出连接,不如导出创建它的 Promise
,事实证明我没有内存泄漏。在执行了大量跟踪后,我确定 GC 确实在收集并且我没有任何增长的块。
我在谷歌搜索其他问题后了解到,我只是同时获得了更多流量,这超出了我在峰值线程并发命中时可用的内存。
我增加了 VM 的内存,但最初并没有帮助,这让我明白这是一个设置问题。我需要增加可用节点内存的大小,这解决了问题。已经运行了好几天没有增长。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。