objective-c - iPhone如何用编程检索内存使用?
ringa_lee
ringa_lee 2017-04-21 11:18:53
0
1
668

我想以编程的方式随时检索iPhone App的内存使用量。是的,我注意到了ObjectAlloc/Leaks。但我对那些不感兴趣,只想知道是否可以通过写代码来获取所使用的字节量,并通过NSLog报告。
谢谢!

原问题:Programmatically retrieve memory usage on iPhone

ringa_lee
ringa_lee

ringa_lee

membalas semua(1)
小葫芦

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;
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan