ios - 我应该避免在全局队列中创建 JSContexts 吗?

标签 ios objective-c cocoa-touch grand-central-dispatch javascriptcore

我刚刚收到客户设备的崩溃日志,它在此处崩溃:

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

那么...在全局队列上创建 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();
    }

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

我最好的猜测是由于内存不足而出现此问题。

您分配了多少个?

关于ios - 我应该避免在全局队列中创建 JSContexts 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21159798/

相关文章:

iOS11自定义导航栏高度

iphone - NSMutableArray 在 reloadData 后变为 nil

ios - iPhone 中的 fbconnect API 响应

iphone - 是否可以在不越狱的情况下记录 iPhone/iPad 屏幕上发生的事情?

ios - 使用_框架!仅适用于某些 pod 或 swift pod

iphone - 如何使 UITableViewCell 上的滑动删除按钮变小?

iPhone View Controller 注册

ios - 将 Cocoapods 链接为共享的 iOS 8 库

objective-c - 如何改变 NSScroller 的颜色?

ios - 从数组设置自定义UITableViewCell的文本