2016-12-02 52 views
0

我需要在V8中有一千个分离物。 但是我遇到了内存奇怪的问题,当我有一些可用的RAM,但V8引发OOM错误消息。我可以创建多少个v8菌株?

例如,

enter image description here

在这种特殊情况下,你可以看到,我们还是有一定的RAM,当V8抛出这个错误。编号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); 

本 - > _ create_params.constraints.set_max_executable_size(maxExecutableSizeMb);

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

非常感谢!

+3

恐怕我们无法猜测您的代码。也不是你的意图。 – Ven

+0

成像我只是做自动隔离= V8 ::隔离::新(这 - > _ create_params);在一个循环中。即使我拥有20%的内存,它也会失败。为什么? –

回答

0

信息在这里有限的,但让我们记住,每个隔离需要它自己的线程,(大概是另一个线程的GC?)

所以1723株将意味着〜3400个线程...

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

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

+0

成像我只是做自动隔离= V8 ::隔离::新(这 - > _ create_params);在一个循环中。即使我拥有20%的内存,它也会失败。为什么? –

+0

@EduardBondarenko崩溃时的线程数是多少? (在调试器中运行) –

+0

所以你说的是...... V8实际上应该使用Erlang,其中“线程”的重量非常轻? – thecoshman

0

呼应600000>的/ proc/sys目录/ VM/max_map_count

为我工作。

0

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

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

另外,除非您打算同时运行数千个脚本,这将需要数千个线程,否则创建数千个孤立点是没有意义的。我建议使用强大的线程池来安排脚本,并按需创建每个线程的V8隔离。

+0

我们有一个预编译代码的千分离。并使用threadpool同时运行代码。谢谢。 –

相关问题