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