在iOS 9上获得免费ram?

时间:2016-02-07 22:27:29

标签: ios iphone ios9

我想在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;
}

2 个答案:

答案 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.;