获取node.js应用程序的最大堆大小

1yjd4xko  于 2023-03-01  发布在  Node.js
关注(0)|答案(3)|浏览(256)

现在我在Paas平台下使用node.js,容器有内存限制,现在我想得到node.js应用程序的最大堆大小,我知道使用参数“--max-old-space-size”,我可以设置最大堆大小,但是我想知道如何得到“--max-old-space-size”的默认值,例如,如果容器的内存是512 m,所以node.js堆大小的最大值不能大于它,我怎么才能得到这个值呢?

q1qsirdb

q1qsirdb1#

您可以尝试使用v8模块,它的文档如下:https://nodejs.org/api/v8.html
我相信getHeapStatistics()函数会给予你所需要的一切

sycxhyv7

sycxhyv72#

您可以使用process.memoryUsagehttps://nodejs.org/api/process.html#process_process_memoryusage

x4shl7ld

x4shl7ld3#

我认为这是不可能的。V8没有通过它的API公开这些信息。
通过node:v8获得的信息不包括“最大旧空间大小”,与可接受的答案相反。从getHeapStatistics()返回的信息只包含total_heap_size
getHeapSpaceStatistics()(注意方法名中的“Space“)可能包含所需的信息,但据我所知,它也只是运行时信息,space_available_size可能不反映max-old-space-size的隐式设置。
Node存储库中有an issue,可以向docs添加关于一般堆大小的简单说明,但它仍然没有得到解决。
我找到了V8源代码中计算默认值的部分,但是我很难理解它,也很难用更简单的伪代码来解释它,也许有人会觉得它很有用:

// Initialize max_old_generation_size_ and max_global_memory_.
  {
    size_t max_old_generation_size = 700ul * (kSystemPointerSize / 4) * MB;
    if (constraints.max_old_generation_size_in_bytes() > 0) {
      max_old_generation_size = constraints.max_old_generation_size_in_bytes();
    }
    if (v8_flags.max_old_space_size > 0) {
      max_old_generation_size =
          static_cast<size_t>(v8_flags.max_old_space_size) * MB;
    } else if (v8_flags.max_heap_size > 0) {
      size_t max_heap_size = static_cast<size_t>(v8_flags.max_heap_size) * MB;
      size_t young_generation_size =
          YoungGenerationSizeFromSemiSpaceSize(max_semi_space_size_);
      max_old_generation_size = max_heap_size > young_generation_size
                                    ? max_heap_size - young_generation_size
                                    : 0;
    }
    max_old_generation_size =
        std::max(max_old_generation_size, MinOldGenerationSize());
    max_old_generation_size = std::min(max_old_generation_size,
                                       AllocatorLimitOnMaxOldGenerationSize());
    max_old_generation_size =
        RoundDown<Page::kPageSize>(max_old_generation_size);

    max_global_memory_size_ =
        GlobalMemorySizeFromV8Size(max_old_generation_size);
    set_max_old_generation_size(max_old_generation_size);
  }

相关问题