有没有办法在对象中运行垃圾收集器?

问题描述 投票:0回答:1

我有以下代码:

let idx = 0;
    for (const e of parsedData) {
      try {
        const datastore = new Datastore({
          namespace: 'bdlight',
          projectId: e.credential.project_id,
          credentials: {
            type: e.credential.type,
            private_key: e.credential.private_key,
            token_url: e.credential.token_uri,
            client_email: e.credential.client_email,
          },
        });

        this.logger.log(
          `Getting Registration - CNS: ${
            e.cns
          } - CNPJCPF: ${documentNumber} - ${idx + 1}/${parsedData.length}`,
        );

        const query = datastore
          .createQuery('geral')
          .filter('CNPJCPF', '=', documentNumber);

        const [result] = await datastore.runQuery(query);

        registrations.push(...(result ? result : []));
      } catch {
        this.logger.log('Error CNS: ' + e.cns);

        errors.push('Erro no CNS: ' + e.cns);
      } finally {
        idx++;
      }
    }

parsedDate 有超过 300 个凭据,当我在 Kubernetes 上的 pod 上运行它时,出现内存泄漏错误,我有一个 4096 RAM 的 pod。我可以在每次迭代后运行垃圾收集器吗?

我尝试在每次迭代后将数据存储设置为空。

node.js google-cloud-datastore
1个回答
0
投票

在每次循环迭代后运行垃圾收集器可能不是解决内存泄漏问题的最佳解决方案。虽然可以使用

global.gc()
(或浏览器中的
window.gc()
)在 JavaScript 中手动触发垃圾回收,但通常不推荐这样做,因为它可能会产生意想不到的后果,并且可能无法有效解决底层内存泄漏问题。

相反,请考虑以下内容:

  1. 使用 heapdump 或 node-heapdump 等内存分析工具来确定内存泄漏的来源。这些工具可以深入了解内存使用情况,并帮助识别分配过多内存的代码区域。
  2. 考虑优化代码以减少内存使用。例如,您可以创建一个实例并在每次迭代中重用它,而不是为循环的每次迭代创建一个新的 Datastore 实例。这可以显着减少内存使用并提高性能。
  3. 如果可能,请考虑将 parsedData 数组拆分为更小的批次并分别处理每个批次。这有助于减少应用程序的整体内存占用量。
  4. 考虑增加 Kubernetes pod 的内存限制。 4096MB 可能不足以处理 300 个或更多凭据,尤其是当代码在每次迭代中执行密集操作时。您可能需要增加内存限制以确保 pod 有足够的资源来处理工作负载。

一般来说,重要的是找出内存泄漏的根本原因并直接解决它,而不是依赖于手动垃圾收集或增加资源限制。

© www.soinside.com 2019 - 2024. All rights reserved.