gpt4 book ai didi

node.js - NodeJS 中的内存泄漏和关闭问题

转载 作者:搜寻专家 更新时间:2023-10-31 22:55:10 26 4
gpt4 key购买 nike

当我们开始测试我们的 NodeJS 项目时,我们注意到巨大的内存消耗。它是由我们项目中的内存泄漏引起的。所以我们开始寻找所有可能产生内存泄漏的原因。这个问题在 stackoverflow 上有一些答案,但是没有任何明确的文件说明什么是内存泄漏,什么不是内存泄漏。

我的问题:

  • 是否有关于 V8 GC 及其工作原理的文档(详细信息)?
  • 如何释放回调以便 GC 可以收集它们?
  • V8 GC 是否会收集未使用但下面有函数闭包的变量?示例:

    var serviceChannel = require('./channel');
    var dataRegistration = require('../data/registration');

    function registerOnChannel(userID, channelID, callsuccess, callerror) {

    serviceChannel.findChannel(channelID, function (channel) {
    if (!channel) {
    callerror("Channel doesn' exists");
    return;
    }
    dataRegistration.registerOnChannel(userID, channelID, function (registration) {
    if (!registration) {
    callerror("Registration doesn' exists");
    return;
    }
    callsuccess("Registration successful");
    }, function (error) {
    callerror("Error on registration");
    })
    }, function (error) {
    callerror("Error on finding channel");
    })
    }

因此,只要 registerOnChanel 处于事件状态,serviceChannel 和 dataRegistration 就会保留在内存中。但是变量channel会不会被GC删除(没有被任何函数使用)?

最佳答案

首先我会说你应该移动你的 API 以使用内置的 EventEmitter ( http://nodejs.org/api/events.html )。

Does the V8 GC collect variables that aren't used but there is a function closure below them?

如果您使用先前函数作用域中的变量,那么该变量将必须保留,直到包含函数作用域以及包含该变量的所有回调都超出作用域。

But will the variable channel be deleted by the GC (it isn't used by any function)?

根据您发布的代码示例,是的,它将由 GC 收集。但是很可能在没有注意到的情况下泄露了一两个引用。

关于node.js - NodeJS 中的内存泄漏和关闭问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16457348/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com