Determining the available amount of RAM on an iOS device
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;
}
Comments
-
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 over 12 yearsI'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 almost 12 yearsI 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 over 10 yearsIf you want to true TOTAL RAM the device has, just use [NSProcessInfo processInfo].physicalMemory.
-
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 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 over 10 years@Steve The nice part about mem_total is shrinks graphics memory is allocated
-
Nico over 10 yearsThere are no private apis called here so yes.
-
Petr over 10 yearsDo you know, this takes in account memory used by GPU, or no?
-
alexandrmoroz about 9 yearsHas anyone check that this code works correct at 64bit devices?
-
Mathias Van Houtte almost 6 yearsHello 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 over 5 yearswhy backslashes in mach\mach.h ?
-
Thomas Elliot over 5 yearsI 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 about 5 yearsThanks for this. Just a comment, I think the Int64 should be UInt64.
-
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 almost 5 years@Nico which one is relevant NSProcessInfo processInfo].physicalMemory ,this one gives in bytes?
-
Jeba Moses over 4 yearsYES. NSProcessInfo processInfo].physicalMemory returns you total RAM size in bytes.
-
Ky - over 2 yearsWhy
MemoryLayout.stride
instead ofMemoryLayout.size
?