Determining the available amount of RAM on an iOS device

38,656

Solution 1

#import <mach/mach.h>
#import <mach/mach_host.h>

void print_free_memory ()
{
    mach_port_t host_port;
    mach_msg_type_number_t host_size;
    vm_size_t pagesize;

    host_port = mach_host_self();
    host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
    host_page_size(host_port, &pagesize);        

    vm_statistics_data_t vm_stat;

    if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS) {
        NSLog(@"Failed to fetch vm statistics");
    }

    /* Stats in bytes */ 
    natural_t mem_used = (vm_stat.active_count +
                          vm_stat.inactive_count +
                          vm_stat.wire_count) * pagesize;
    natural_t mem_free = vm_stat.free_count * pagesize;
    natural_t mem_total = mem_used + mem_free;
    NSLog(@"used: %u free: %u total: %u", mem_used, mem_free, mem_total);
}

Please note that this call does not account for memory that is being used by the gpu. If you are seeing a size that is smaller than expected system ram. It is more than likely allocated graphics memory.

Solution 2

This works in Swift 4.

The really important difference here is: It casts to Int64 before multiplying, because otherwise you get quickly overflows, especially if you run it in a simulator where it uses the PC Memory.

var pagesize: vm_size_t = 0

let host_port: mach_port_t = mach_host_self()
var host_size: mach_msg_type_number_t = mach_msg_type_number_t(MemoryLayout<vm_statistics_data_t>.stride / MemoryLayout<integer_t>.stride)
host_page_size(host_port, &pagesize)

var vm_stat: vm_statistics = vm_statistics_data_t()
withUnsafeMutablePointer(to: &vm_stat) { (vmStatPointer) -> Void in
    vmStatPointer.withMemoryRebound(to: integer_t.self, capacity: Int(host_size)) {
        if (host_statistics(host_port, HOST_VM_INFO, $0, &host_size) != KERN_SUCCESS) {
            NSLog("Error: Failed to fetch vm statistics")
        }
    }
}

/* Stats in bytes */
let mem_used: Int64 = Int64(vm_stat.active_count +
        vm_stat.inactive_count +
        vm_stat.wire_count) * Int64(pagesize)
let mem_free: Int64 = Int64(vm_stat.free_count) * Int64(pagesize)

Solution 3

You can check the available RAM Memory in an iOS devices

    #import mach\mach.h
    #import mach\mach_host.h

     static natural_t get_free_memory(void)  
     {  
       mach_port_t host_port;  
       mach_msg_type_number_t host_size;  
       vm_size_t pagesize;  
       host_port = mach_host_self();  
       host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);  
       host_page_size(host_port, &pagesize);  
       vm_statistics_data_t vm_stat;  
       if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS)  
       {  
         NSLog(@"Failed to fetch vm statistics");  
         return 0;  
       }  
       /* Stats in bytes */  
       natural_t mem_free = vm_stat.free_count * pagesize;  
       return mem_free;  
     }  
Share:
38,656
m0rtimer
Author by

m0rtimer

mySelf.description.isRelevant == false;

Updated on July 05, 2022

Comments

  • m0rtimer
    m0rtimer almost 2 years

    You've likely seen the many "System Info" apps out there which display things like remaining battery life, and even system info like memory, etc.

    In a similar manner, is there any way to retrieve the current amount of available RAM from my app so that I can make better decisions on when it's best to dump or keep certain views to avoid memory warnings?

  • David H
    David H over 12 years
    I'm shocked that I'm the first person to give you a point on this code. Its working great on my iPhone and is a huge help to me! I wish I could give you 10 points!!!
  • David H
    David H almost 12 years
    I did find one other command you can add to the above, to get task stats: struct task_basic_info info; if(dump_memory_usage(&info)) { fm.resident_size = (size_t)info.resident_size; fm.virtual_size = (size_t)info.virtual_size; }
  • Steve
    Steve over 10 years
    If you want to true TOTAL RAM the device has, just use [NSProcessInfo processInfo].physicalMemory.
  • Nico
    Nico over 10 years
    @Steve, Provides the amount of physical memory on the computer. - (unsigned long long)physicalMemory How does this tell you how much memory your application is using?
  • Steve
    Steve over 10 years
    @Nico, it doesn't. It tells the total system RAM. I recommend this instead of mem_total/mem_free, not instead of mem_used. This is because mem_total/mem_free depend on how much RAM is being used by other apps to, and so it's a completely unreliable indicator for pretty much anything.
  • Nico
    Nico over 10 years
    @Steve The nice part about mem_total is shrinks graphics memory is allocated
  • Nico
    Nico over 10 years
    There are no private apis called here so yes.
  • Petr
    Petr over 10 years
    Do you know, this takes in account memory used by GPU, or no?
  • alexandrmoroz
    alexandrmoroz about 9 years
    Has anyone check that this code works correct at 64bit devices?
  • Mathias Van Houtte
    Mathias Van Houtte almost 6 years
    Hello I tried your example but I have very different values for mem_used. When I convert it to MB, it gives me 120MB while in XCode, it gives me 30MB. Any idea why?
  • ingconti
    ingconti over 5 years
    why backslashes in mach\mach.h ?
  • Thomas Elliot
    Thomas Elliot over 5 years
    I believe the total memory calculation is inaccurate. Cross-reference it with [NSProcessInfo processInfo].physicalMemory and you'll see the latter is more closely aligned with the device's marketed memory spec.
  • Kleomenis Katevas
    Kleomenis Katevas about 5 years
    Thanks for this. Just a comment, I think the Int64 should be UInt64.
  • Jan
    Jan about 5 years
    @Minos I disagree. Remember that 2^63 is already 9,223,372,036,854,775,808 and Int64 has as signed integer the advantage that some subtractions won't produce exceptions when going below 0.
  • Srishti Roy
    Srishti Roy almost 5 years
    @Nico which one is relevant NSProcessInfo processInfo].physicalMemory ,this one gives in bytes?
  • Jeba Moses
    Jeba Moses over 4 years
    YES. NSProcessInfo processInfo].physicalMemory returns you total RAM size in bytes.
  • Ky -
    Ky - over 2 years
    Why MemoryLayout.stride instead of MemoryLayout.size?