Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSRunLoop is consuming a lot of cpu and memory

I have a infinite loop that drives my worker thread.

-(void) myThread
{
    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];   
    while(![myThread isCancelled])
    {
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:600]];
    }
    [pool release];
}

but sometimes these threads are taking so much CPU(50-100%) and memory(1.5GB). when i sample the application in this state, i got following trace

    453 +[NSDate dateWithTimeIntervalSinceNow:]
          309 -[__NSPlaceholderDate initWithTimeIntervalSinceReferenceDate:]
            295 CFDateCreate
              268 _CFRuntimeCreateInstance
                115 malloc_zone_malloc
                  64 __spin_lock
                    64 __spin_lock
                  43 szone_malloc
                    22 tiny_malloc_from_free_list
                      22 tiny_malloc_from_free_list
                    19 szone_malloc
                    2 spin_unlock
                      2 spin_unlock
                  4 malloc_zone_malloc
                  3 dyld_stub__spin_unlock
                    3 dyld_stub__spin_unlock
                  1 dyld_stub__spin_lock
                    1 dyld_stub__spin_lock
                99 __bzero
                  99 __bzero
                29 malloc_size
                  23 szone_size
                    23 szone_size
                  6 malloc_size
                13 CFAllocatorAllocate
                  13 CFAllocatorAllocate
                12 _CFRuntimeCreateInstance
              20 CFDateCreate
              4 CFDateGetTypeID
                4 CFDateGetTypeID
              3 memset
                3 memset
            14 -[__NSPlaceholderDate initWithTimeIntervalSinceReferenceDate:]
          60 CFAbsoluteTimeGetCurrent
            48 gettimeofday
              38 __gettimeofday
                21 __nanotime
                  21 __nanotime
                17 __gettimeofday
              10 gettimeofday
            11 CFAbsoluteTimeGetCurrent
            1 __gettimeofday
              1 __gettimeofday
          47 +[NSObject alloc]
            25 objc_msgSend
              25 objc_msgSend
            11 +[NSDate allocWithZone:]
              8 +[NSObject self]
                8 +[NSObject self]
              3 +[NSDate allocWithZone:]
            7 +[NSObject alloc]
            2 +[__NSPlaceholderDate immutablePlaceholder]
              2 +[__NSPlaceholderDate immutablePlaceholder]
            2 dyld_stub_objc_msgSend
              2 dyld_stub_objc_msgSend
          24 +[NSDate dateWithTimeIntervalSinceNow:]
          7 objc_msgSend
            7 objc_msgSend
          4 CFMakeCollectable
            4 CFMakeCollectable
          1 dyld_stub_gettimeofday
            1 dyld_stub_gettimeofday
          1 dyld_stub_objc_msgSend
            1 dyld_stub_objc_msgSend
        354 -[NSRunLoop(NSRunLoop) runUntilDate:]
          307 -[NSRunLoop(NSRunLoop) runMode:beforeDate:]
            153 _CFRunLoopFinished
              125 __CFRunLoopFindMode
                110 CFSetGetValue
                  85 __CFSetFindBuckets1b
                    36 __CFSetFindBuckets1b
                    17 CFEqual
                      9 __CFRunLoopModeEqual
                        7 CFEqual
                          7 CFEqual
                        2 __CFRunLoopModeEqual
                      8 CFEqual
                    16 __CFStringHash
                      16 __CFStringHash
                    12 _CFHash
                      12 _CFHash
                    3 CFHash
                      3 CFHash
                    1 __CFRunLoopModeHash
                      1 __CFRunLoopModeHash
                  24 CFSetGetValue
                  1 CFEqual
                    1 CFEqual
                14 __CFRunLoopFindMode
                1 _CFRuntimeSetInstanceTypeID
                  1 _CFRuntimeSetInstanceTypeID
              12 _CFRunLoopFinished
              9 __CFRunLoopModeIsEmpty
                8 CFSetGetCount
                  8 CFSetGetCount
                1 __CFRunLoopModeIsEmpty
              6 __spin_lock
                6 __spin_lock
              1 spin_unlock
                1 spin_unlock
            82 -[NSCFString isEqual:]
              23 -[NSCFString isEqual:]
              22 objc_msgSend
                22 objc_msgSend
              17 CFStringGetLength
                17 CFStringGetLength
              9 CFStringGetCStringPtr
                9 CFStringGetCStringPtr
              6 NSClassFromObject
                2 -[NSObject class]
                  2 -[NSObject class]
                2 NSClassFromObject
                2 object_getClass
                  2 object_getClass
              3 object_getClass
                3 object_getClass
              1 dyld_stub_objc_msgSend
                1 dyld_stub_objc_msgSend
              1 dyld_stub_object_getClass
                1 dyld_stub_object_getClass
            37 _CFRunLoop0
              16 _CFRunLoop0
              12 CFDictionaryGetValue
                10 __CFDictionaryFindBuckets1a
                  10 __CFDictionaryFindBuckets1a
                2 CFDictionaryGetValue
              8 pthread_main_np
                8 pthread_main_np
              1 spin_unlock
                1 spin_unlock
            12 -[NSRunLoop(NSRunLoop) runMode:beforeDate:]
            11 __spin_lock
              11 __spin_lock
            6 dyld_stub_OSSpinLockUnlock
              6 dyld_stub_OSSpinLockUnlock
            3 CFRunLoopGetCurrent
              3 CFRunLoopGetCurrent
            1 dyld_stub_CFStringGetCStringPtr
              1 dyld_stub_CFStringGetCStringPtr
            1 dyld_stub_pthread_self
              1 dyld_stub_pthread_self
            1 spin_unlock
              1 spin_unlock
          25 -[__NSCFDate retain]
            15 OSAtomicCompareAndSwapLongBarrier
              8 __compare_and_swap32
                8 __compare_and_swap32
              7 OSAtomicCompareAndSwapLongBarrier
            4 -[__NSCFDate retain]
            4 _CFRetain
              4 _CFRetain
            1 CFRetain
              1 CFRetain
            1 __compare_and_swap32
              1 __compare_and_swap32
          14 -[NSRunLoop(NSRunLoop) runUntilDate:]
          7 objc_msgSend
            7 objc_msgSend
          1 dyld_stub__CFRunLoopFinished
            1 dyld_stub__CFRunLoopFinished
        51 objc_msgSend
          51 objc_msgSend
        39 -[NSObject(NSObject) autorelease]
          28 __NSAutoreleaseObject
            24 __NSAutoreleaseObject
            4 _NSAPAddPage
              2 _NSAPAddPage
              2 malloc
                2 malloc_zone_malloc
                  2 szone_malloc
                    2 small_malloc_from_free_list
                      1 small_free_list_add_ptr
                        1 small_free_list_add_ptr
                      1 small_malloc_from_free_list
          8 NSAutoreleaseObject
            7 NSAutoreleaseObject
            1 objc_collecting_enabled
              1 objc_collecting_enabled
          1 -[NSObject(NSObject) autorelease]
          1 dyld_stub_pthread_getspecific
            1 dyld_stub_pthread_getspecific
          1 pthread_getspecific
            1 pthread_getspecific
        19 +[NSRunLoop(NSRunLoop) currentRunLoop]
          14 +[NSThread currentThread]
            13 +[NSThread currentThread]
            1 pthread_getspecific
              1 pthread_getspecific
          3 +[NSRunLoop(NSRunLoop) currentRunLoop]
          1 dyld_stub_pthread_getspecific
            1 dyld_stub_pthread_getspecific
          1 pthread_getspecific
            1 pthread_getspecific
        14 -[NSThread _rl]
          14 -[NSThread _rl]
        13 -[MessageSendingModule startSender]
        12 -[NSThread isCancelled]
          12 -[NSThread isCancelled]
        9 OSAtomicCompareAndSwapLongBarrier
          5 OSAtomicCompareAndSwapLongBarrier
          4 __compare_and_swap32
            4 __compare_and_swap32
        6 CFRelease
          6 CFRelease
        6 _CFRelease
          6 _CFRelease
        1 -[__NSCFDate release]
          1 -[__NSCFDate release]
        1 NSAutoreleaseObject
          1 NSAutoreleaseObject
        1 dyld_stub_objc_msgSend
          1 dyld_stub_objc_msgSend
      115 objc_msgSend
        115 objc_msgSend
      4 dyld_stub_objc_msgSend
        4 dyld_stub_objc_msgSend
      1 CFRelease
        1 CFRelease

can anyone please help me out?

like image 332
Parag Bafna Avatar asked Nov 25 '25 06:11

Parag Bafna


1 Answers

An empty runloop (a runloop without any input sources or timers) will immediately return from runUntilDate:.

If you want to keep the thread around and service it's runloop, you could just add a timer to the runloop.

Is there any reason you're not using libdispatch for your thread dispatching? This would avoid the troubles of managing the threads and runloop yourself.

like image 158
Nikolai Ruhe Avatar answered Nov 27 '25 21:11

Nikolai Ruhe



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!