2013-07-28 45 views
0

我正在使用以下代碼來獲取iOS和Cocoa(Mach)上的CPU負載。Mach代碼導致iOS和Cocoa上的內存耗盡

奇怪的是:如果我定期調用這個代碼,比如說每秒30次,可用內存逐漸縮小,最終程序崩潰。

用儀器分析程序,我看到既沒有泄漏也沒有新的內存分配(泄漏圖是空的,分配圖是平的)。儘管如此,可用的物理內存一直在下降,直到程序崩潰(在256MB的iPod上至少需要40分鐘,所以它不是一個大的內存佔用)。

我懷疑是這段代碼使用了一些內核資源,並沒有正確釋放它。

有人能解釋這種行爲嗎?

#include "cpu_usage.h" 
#import <mach/mach.h> 

float cpu_usage() 
{ 
kern_return_t kr; 
task_info_data_t tinfo; 
mach_msg_type_number_t task_info_count; 

task_info_count = TASK_INFO_MAX; 
kr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)tinfo, &task_info_count); 
if (kr != KERN_SUCCESS) { 
    return -1; 
} 

thread_array_t   thread_list; 
mach_msg_type_number_t thread_count; 

thread_info_data_t  thinfo; 
mach_msg_type_number_t thread_info_count; 

thread_basic_info_t basic_info_th; 

kr = task_threads(mach_task_self(), &thread_list, &thread_count); 
if (kr != KERN_SUCCESS) { 
    return -1; 
} 

long tot_sec = 0; 
long tot_usec = 0; 
float tot_cpu = 0; 
int j; 

for (j = 0; j < thread_count; j++) 
{ 
    thread_info_count = THREAD_INFO_MAX; 
    kr = thread_info(thread_list[j], THREAD_BASIC_INFO, 
        (thread_info_t)thinfo, &thread_info_count); 
    if (kr != KERN_SUCCESS) { 
     return -1; 
    } 

    basic_info_th = (thread_basic_info_t)thinfo; 

    if (!(basic_info_th->flags & TH_FLAGS_IDLE)) { 
     tot_sec = tot_sec + basic_info_th->user_time.seconds + basic_info_th->system_time.seconds; 
     tot_usec = tot_usec + basic_info_th->system_time.microseconds + basic_info_th->system_time.microseconds; 
     tot_cpu = tot_cpu + basic_info_th->cpu_usage/(float)TH_USAGE_SCALE * 100.0; 
    } 

} 

return tot_cpu; 
} 

回答

2

從這個問題的答案iOS - Get CPU usage from application可以看出,該內存

kr = task_threads(mach_task_self(), &thread_list, &thread_count); 

分配必須使用被釋放

kr = vm_deallocate(mach_task_self(), (vm_offset_t)thread_list, 
       thread_count * sizeof(thread_t));