Rumah > Soal Jawab > teks badan
我想以编程的方式随时检索iPhone App的内存使用量。是的,我注意到了ObjectAlloc/Leaks。但我对那些不感兴趣,只想知道是否可以通过写代码来获取所使用的字节量,并通过NSLog报告。
谢谢!
原问题:Programmatically retrieve memory usage on iPhone
高洛峰2017-04-21 11:20:53
Jason Coco:
Untuk mendapatkan bait memori yang sebenarnya digunakan oleh Apl, anda boleh menggunakan kaedah berikut. Walau bagaimanapun, anda mesti mahir dalam pelbagai alat analisis, kerana mereka mereka bentuk gambaran penggunaan keseluruhan yang kelihatan lebih baik.
#import <mach/mach.h>
// ...
void report_memory(void) {
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(),
TASK_BASIC_INFO,
(task_info_t)&info,
&size);
if( kerr == KERN_SUCCESS ) {
NSLog(@"Memory in use (in bytes): %u", info.resident_size);
} else {
NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
}
}
Terdapat medan dalam info.virtual_size yang memberitahu anda jumlah tepat bait memori maya yang tersedia (atau dalam apa jua keadaan potensi memori maya yang diperuntukkan kepada apl). Kod yang dipautkan oleh Pgb akan memberikan anda memori yang tersedia dan jenis memori peranti.
Douglas K. Bell:
Ini ialah report_memory() dipertingkatkan yang boleh menunjukkan kebocoran memori dengan cepat dalam NSLog().
void report_memory(void) {
static unsigned last_resident_size=0;
static unsigned greatest = 0;
static unsigned last_greatest = 0;
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(),
TASK_BASIC_INFO,
(task_info_t)&info,
&size);
if( kerr == KERN_SUCCESS ) {
int diff = (int)info.resident_size - (int)last_resident_size;
unsigned latest = info.resident_size;
if( latest > greatest ) greatest = latest; // track greatest mem usage
int greatest_diff = greatest - last_greatest;
int latest_greatest_diff = latest - greatest;
NSLog(@"Mem: %10u (%10d) : %10d : greatest: %10u (%d)", info.resident_size, diff,
latest_greatest_diff,
greatest, greatest_diff );
} else {
NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
}
last_resident_size = info.resident_size;
last_greatest = greatest;
}