我需要在V8中拥有数千种分离物。 但是我遇到了奇怪的内存问题,当我有一些空闲的RAM,但是v8会抛出OOM错误消息。
例如,
在这种特殊情况下,当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();
非常感谢!
答案 0 :(得分:0)
此处的信息有限,但请记住,每个Isolate都需要自己的线程(并且可能是GC的另一个线程?)
所以1723 Isolates意味着~3400个线程......
每个线程都需要(正常默认值)1MB的堆栈。
这就是那里分配的3.4GB内存。
答案 1 :(得分:0)
每个V8隔离区都会保留一大块地址空间,因此一旦您创建了一些隔离区,由于地址空间耗尽而不是实际的内存使用情况,进一步的尝试可能会失败。
在32位进程中,在大多数操作系统启动失败V8的预留请求之前,您只能创建50-100个隔离区。 64位V8显然有更多的地址空间可供使用,但它也保留了更大的块。
此外,创建数千个隔离区是没有意义的,除非您打算同时运行数千个脚本,这需要数千个线程。我建议使用一个健壮的线程池来安排你的脚本,并按需创建每个线程的V8隔离。