我想在iOS设备上获得免费ram但是下面的代码在iOS 9,iphone 5s设备上给了我34MB,即使只有1个应用程序正在使用98MB内存。以下代码中是否有一些错误?
natural_t get_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");
}
natural_t mem_free = vm_stat.free_count * pagesize;
return mem_free;
}
答案 0 :(得分:2)
iOS是一个Unix系统(源自BSD),具有多任务和复杂的内存管理功能。
手机上只有一个进程正在运行的可能性很小。即使没有正在运行的应用程序(即您通过在任务切换器中“向上滑动”主动终止所有其他应用程序),仍然有大量守护进程运行以执行各种任务。
除此之外,还有内核使用的内存,以及通过各种路径用作缓存的内存。可用内存根本不是可用内存的指示,因为系统会尝试尽可能多地使用内存来缓存和其他类似用途。
我有一个FreeBSD盒子(FreeBSD就在Mac OS X之后,可能是最接近iOS的操作系统),64 GB内存基本没什么,它报告848 MB免费...但56 GB“非活动”内存,超过1 GB“缓存”和1.5GB“缓冲区”。大多数内存实际上是可用的,它不被认为是“免费的”,因为操作系统实际上有其页面的映射(但如果需要将释放它们)。
答案 1 :(得分:0)
这是一份完整的报告:
vm_statistics_data_t vmStats;
mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;
host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmStats, &infoCount);
int availablePages = vmStats.free_count;
float availableMemory = (float)availablePages*vm_page_size/1024./1024.;
int activePages = vmStats.active_count;
float activeMemory = (float)activePages*vm_page_size/1024./1024.;
int inactivePages = vmStats.inactive_count;
float inactiveMemory = (float)inactivePages*vm_page_size/1024./1024.;
int wirePages = vmStats.wire_count;
float wireMemory = (float)wirePages*vm_page_size/1024./1024.;
int pageoutsPages = vmStats.pageouts;
float pageoutsMemory = (float)pageoutsPages*vm_page_size/1024./1024.;
int hitsPages = vmStats.hits;
float hitsMemory = (float)hitsPages*vm_page_size/1024./1024.;
int purgeable_countPages = vmStats.purgeable_count;
float purgeable_countMemory = (float)purgeable_countPages*vm_page_size/1024./1024.;
int speculative_countPages = vmStats.speculative_count;
float speculative_countMemory = (float)speculative_countPages*vm_page_size/1024./1024.;