我应该避免在全局队列中创buildJSContexts?

我刚刚从客户的设备上得到了一个崩溃日志,而且在这里崩溃了:

dispatch_async(dispatch_get_global_queue(0, 0), ^{ JSContext *javaScriptContext = [[JSContext alloc] init]; 

这里是崩溃日志:

 Thread 11 Crashed: 0 JavaScriptCore 0x31009cd6 WTFCrash + 54 1 JavaScriptCore 0x30e0edf6 WTF::OSAllocator::reserveAndCommit(unsigned long, WTF::OSAllocator::Usage, bool, bool, bool) + 166 2 JavaScriptCore 0x30e0ed2a WTF::OSAllocator::reserveUncommitted(unsigned long, WTF::OSAllocator::Usage, bool, bool, bool) + 14 3 JavaScriptCore 0x30e14736 JSC::JSStack::JSStack(JSC::VM&, unsigned long) + 74 4 JavaScriptCore 0x30e146d2 JSC::Interpreter::Interpreter(JSC::VM&) + 22 5 JavaScriptCore 0x30e10fb8 JSC::VM::VM(JSC::VM::VMType, JSC::HeapType) + 2516 6 JavaScriptCore 0x30fbf48e JSC::VM::createContextGroup(JSC::HeapType) + 22 7 JavaScriptCore 0x30fbdc86 JSContextGroupCreate + 14 8 JavaScriptCore 0x30fd209e -[JSVirtualMachine init] + 6 9 JavaScriptCore 0x30fbd122 -[JSContext init] + 46 10 <redacted> 11 libdispatch.dylib 0x3a776d78 _dispatch_call_block_and_release + 8 12 libdispatch.dylib 0x3a77dda0 _dispatch_root_queue_drain + 216 13 libdispatch.dylib 0x3a77df88 _dispatch_worker_thread2 + 52 14 libsystem_pthread.dylib 0x3a8b8dbc _pthread_wqthread + 296 15 libsystem_pthread.dylib 0x3a8b8c80 start_wqthread + 4 

WTFCrash的确如此。

在这一点上,其他几个线程忙于Javascript相关的内存的东西:

 Thread 10: 0 libsystem_kernel.dylib 0x3a83f970 _kernelrpc_mach_vm_deallocate_trap + 20 1 libsystem_kernel.dylib 0x3a83fc5a mach_vm_deallocate + 26 2 libsystem_kernel.dylib 0x3a83fc36 vm_deallocate + 14 3 JavaScriptCore 0x30e18f20 JSC::BlockAllocator::releaseFreeRegions() + 64 4 JavaScriptCore 0x30f89784 JSC::CopiedSpace::~CopiedSpace() + 20 5 JavaScriptCore 0x30faea28 JSC::Heap::~Heap() + 336 6 JavaScriptCore 0x30fbf434 JSC::VM::~VM() + 2600 7 JavaScriptCore 0x30e0bb82 JSC::JSLockHolder::~JSLockHolder() + 90 8 JavaScriptCore 0x30fbdcf8 JSContextGroupRelease + 76 9 JavaScriptCore 0x30fd21be -[JSVirtualMachine dealloc] + 22 10 libobjc.A.dylib 0x3a29eb06 objc_object::sidetable_release(bool) + 170 11 libobjc.A.dylib 0x3a290002 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 354 12 libdispatch.dylib 0x3a77de08 _dispatch_root_queue_drain + 320 13 libdispatch.dylib 0x3a77df88 _dispatch_worker_thread2 + 52 14 libsystem_pthread.dylib 0x3a8b8dbc _pthread_wqthread + 296 15 libsystem_pthread.dylib 0x3a8b8c80 start_wqthread + 4 Thread 15 name: JavaScriptCore::BlockFree Thread 15: 0 libsystem_kernel.dylib 0x3a851f38 __psynch_cvwait + 24 1 libsystem_pthread.dylib 0x3a8ba224 _pthread_cond_wait + 536 2 libsystem_pthread.dylib 0x3a8bb040 pthread_cond_timedwait + 40 3 JavaScriptCore 0x30e12eb8 WTF::ThreadCondition::timedWait(WTF::Mutex&, double) + 104 4 JavaScriptCore 0x30e12ce4 JSC::BlockAllocator::blockFreeingThreadMain() + 88 5 JavaScriptCore 0x30e103a8 WTF::wtfThreadEntryPoint(void*) + 12 6 libsystem_pthread.dylib 0x3a8bac1a _pthread_body + 138 7 libsystem_pthread.dylib 0x3a8bab8a _pthread_start + 98 8 libsystem_pthread.dylib 0x3a8b8c8c thread_start + 4 Thread 16 name: JavaScriptCore::Marking Thread 16: 0 libsystem_kernel.dylib 0x3a851f38 __psynch_cvwait + 24 1 libsystem_pthread.dylib 0x3a8ba224 _pthread_cond_wait + 536 2 libsystem_pthread.dylib 0x3a8bb000 pthread_cond_wait + 36 3 JavaScriptCore 0x30fae23e JSC::GCThread::waitForNextPhase() + 74 4 JavaScriptCore 0x30fae298 JSC::GCThread::gcThreadMain() + 48 5 JavaScriptCore 0x30e103a8 WTF::wtfThreadEntryPoint(void*) + 12 6 libsystem_pthread.dylib 0x3a8bac1a _pthread_body + 138 7 libsystem_pthread.dylib 0x3a8bab8a _pthread_start + 98 8 libsystem_pthread.dylib 0x3a8b8c8c thread_start + 4 Thread 17 name: JavaScriptCore::BlockFree Thread 17: 0 libsystem_kernel.dylib 0x3a851f38 __psynch_cvwait + 24 1 libsystem_pthread.dylib 0x3a8ba224 _pthread_cond_wait + 536 2 libsystem_pthread.dylib 0x3a8bb040 pthread_cond_timedwait + 40 3 JavaScriptCore 0x30e12eb8 WTF::ThreadCondition::timedWait(WTF::Mutex&, double) + 104 4 JavaScriptCore 0x30e12ce4 JSC::BlockAllocator::blockFreeingThreadMain() + 88 5 JavaScriptCore 0x30e103a8 WTF::wtfThreadEntryPoint(void*) + 12 6 libsystem_pthread.dylib 0x3a8bac1a _pthread_body + 138 7 libsystem_pthread.dylib 0x3a8bab8a _pthread_start + 98 8 libsystem_pthread.dylib 0x3a8b8c8c thread_start + 4 

那么…在全局队列上创build一个JSContext有什么问题? 我应该怎样做才能避免这个问题呢?

幸运的是它是开源的!

http://www.opensource.apple.com/source/JavaScriptCore/JavaScriptCore-7534.57.3/wtf/OSAllocatorPosix.cpp

 void* OSAllocator::reserveAndCommit(size_t bytes, Usage usage, bool writable, bool executable, bool includesGuardPages) 

尝试分配一个虚拟机,通过分配一些内存

 result = mmap(result, bytes, protection, flags, fd, 0); if (result == MAP_FAILED) { ... CRASH(); } 

内存分配失败,应用程序崩溃。

所以,我最好的猜测是,由于内存不足,这个问题会突然出现。

你分配了多less?

我遇到过类似的问题。 最终额外的JavaScriptCore :: BlockFree线程是没有得到释放JSContext的症状。 我build议检查,以确保您的JSVirtualMachine和JSContext在执行结束时获得释放。

另外,现在我已经成功地创build了许多JSVirtualMachines(在运行过程中1000+),所以我不认为这有什么问题,除非你需要很多这些并发运行(比如50+ )。

希望有所帮助!