4

난 그냥 고객의 장치에서 충돌 로그를 했어, 그리고 여기 충돌 것 :글로벌 큐에 JSContext를 작성하지 않아야합니까?

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을, 참. 다른 스레드의 여러 시점에서

는, 자바 스크립트 관련 메모리 물건 바빴다 :

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을 만드는 문제? 문제를 피하기 위해 다르게해야 할 일은 무엇입니까?

+0

실제로 도움이 될만한 고유 JSContext를 너무 많이 만들지 말 것을 제안합니다. 대신 매번 새로운 JSContext를 만드는 대신 단일 JSContext (가능한 경우!)를 활용해야합니다. 큐 항목마다 새 JSContext를 만드는 대신 큐 실행에 단일 JSContext를 활용할 수 있습니까? –

+0

그러나 각 큐 항목에 대해 새로운 JSContext를 작성해야하는 이유의 근본을 실제로 알지 못하는 경우에도 이는 단순한 문장입니다. 기존 JSContext를 여러 가지 용도로 재사용하는 데 더 많은 통찰력을 얻으려면 저도 도와 드리겠습니다. –

답변

7

운 좋게도 오픈 소스입니다!

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(); 
    } 

앱 충돌을 할당하여, 가상 머신을 할당합니다.

소주 내 추측으로는 메모리 부족으로이 문제가 나타납니다.

몇 개를 할당하고 있습니까?

+0

한 번에 하나씩 만 사용해야합니다. 생각할 때 그들이 정리되지 않는다고 가정 할 때, 사고가 발생할 때까지 10 ~ 20 명이 있어야했을 것입니다. 고객의 32 비트 장치에서만 발생합니다. 아마 이것과 관련이 있나? http://stackoverflow.com/questions/17921652/cocoa-mac-javascript-core-crash-on-the-38th-call – Simon

+0

iPhone 5에서도 발생합니까? 4S는 RAM의 절반을 가지고 있기 때문에 OS가 메모리 굶주림에 불과할 수도 있습니다. iPhone5에서 발생한다면 32 비트 문제 일 것입니다. – Andrew

+0

테스트를 위해 5를 추적하려고 노력할 것입니다. * * 32 비트 문제라면, 어떻게해야합니까? – Simon

1

비슷한 문제가 발생했습니다. 궁극적으로 여분의 JavaScriptCore :: BlockFree 스레드는 JSContext가 해제되지 않는 증상이었습니다. 나는 당신의 JSVirtualMachine과 JSContext가 실행의 끝에서 해제되고 있는지 확인하기를 제안 할 것이다.

또한 제쳐두고 이제는 아무런 문제없이 많은 JSVirtualMachines (실행 중 1000+)를 성공적으로 만들었습니다. 따라서이 중 많은 수가 동시에 실행해야하는 경우가 아니라면 문제가 있다고 생각하지 않습니다. (예 : 50+).

희망 하시겠습니까?