recherche

Maison  >  Questions et réponses  >  le corps du texte

objective-c - iPhone如何用编程检索内存使用?

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

原问题:Programmatically retrieve memory usage on iPhone

ringa_leeringa_lee2845 Il y a quelques jours677

répondre à tous(1)je répondrai

  • 高洛峰

    高洛峰2017-04-21 11:20:53

    Jason Coco :
    Afin d'obtenir les octets de mémoire réellement utilisés par l'application, vous pouvez utiliser la méthode suivante. Cependant, vous devez maîtriser divers outils d’analyse, car ils permettent d’obtenir une meilleure image de l’utilisation globale.

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

    Il y a un champ dans info.virtual_size qui vous indique le nombre exact d'octets de mémoire virtuelle disponible (ou en tout cas la mémoire virtuelle potentielle allouée à l'application). Le code lié par Pgb vous donnera la mémoire disponible et le type de mémoire de l'appareil.


    Douglas K. Bell:
    Il s'agit d'un report_memory() amélioré qui peut afficher rapidement les fuites de mémoire dans 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;
    }
    

    répondre
    0
  • Annulerrépondre