我可以创建多少个v8菌株?

时间:2016-12-02 15:49:52

标签: c++ v8 embedded-v8

我需要在V8中拥有数千种分离物。 但是我遇到了奇怪的内存问题,当我有一些空闲的RAM,但是v8会抛出OOM错误消息。

例如,

enter image description here

在这种特殊情况下,当V8抛出此错误时,您可以看到我们仍然有一些RAM。编号2047 - 迭代器编号。基本上代码看起来像:

for(int i = 0; i < 3000; i++) {
   std::cout << i << std::endl;
   new Isolate(params);
}

也许我需要增加堆栈大小限制。我已将它设置为16Mb。而且还有这个问题。 htop只显示了4个线程。所以我不认为线程存在问题。

我在v8课程中做了

  this->_maxRAMAvailable = 8; // 8Gb in my case
  int maxOldSpaceMb = this->_maxRAMAvailable * 1024;
  int maxSemiSpaceMb = 512;
  int maxExecutableSizeMb = 512;

  v8::V8::InitializeICUDefaultLocation(argv[0]);
  v8::V8::InitializeExternalStartupData(argv[0]);
  this->_platform = v8::platform::CreateDefaultPlatform();
  this->_create_params.array_buffer_allocator =
  v8::ArrayBuffer::Allocator::NewDefaultAllocator();

  const uint64_t physical_memory = this->_maxRAMAvailable * 1024 * 1024 * 1024;
  const uint64_t virtual_memory_limit = 0;
  this->_create_params.constraints.ConfigureDefaults(physical_memory, virtual_memory_limit);

  this->_create_params.constraints.set_max_old_space_size(maxOldSpaceMb);
  this->_create_params.constraints.set_max_semi_space_size(maxSemiSpaceMb);

这 - &GT; _create_params.constraints.set_max_executable_size(maxExecutableSizeMb);

  v8::V8::InitializePlatform(this->_platform);
  v8::V8::Initialize();

非常感谢!

2 个答案:

答案 0 :(得分:0)

此处的信息有限,但请记住,每个Isolate都需要自己的线程(并且可能是GC的另一个线程?)

所以1723 Isolates意味着~3400个线程......

每个线程都需要(正常默认值)1MB的堆栈。

这就是那里分配的3.4GB内存。

答案 1 :(得分:0)

每个V8隔离区都会保留一大块地址空间,因此一旦您创建了一些隔离区,由于地址空间耗尽而不是实际的内存使用情况,进一步的尝试可能会失败。

在32位进程中,在大多数操作系统启动失败V8的预留请求之前,您只能创建50-100个隔离区。 64位V8显然有更多的地址空间可供使用,但它也保留了更大的块。

此外,创建数千个隔离区是没有意义的,除非您打算同时运行数千个脚本,这需要数千个线程。我建议使用一个健壮的线程池来安排你的脚本,并按需创建每个线程的V8隔离。