Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我的iPad运行时内存去哪里了?_Ios_Memory_Heap Fragmentation - Fatal编程技术网

Ios 我的iPad运行时内存去哪里了?

Ios 我的iPad运行时内存去哪里了?,ios,memory,heap-fragmentation,Ios,Memory,Heap Fragmentation,显然,我正在导致设备(iPad)内存耗尽,所以它正在抛弃我的应用程序。我正在试图了解发生了什么,因为仪器告诉我,我正在使用大约80Mb的内存,而且设备上没有运行其他应用程序 我发现这个代码片段是为了向iOS下的Mach系统询问内存统计信息: #import <mach/mach.h> #import <mach/mach_host.h> static void print_free_memory () { mach_port_t host_port; mach_msg_

显然,我正在导致设备(iPad)内存耗尽,所以它正在抛弃我的应用程序。我正在试图了解发生了什么,因为仪器告诉我,我正在使用大约80Mb的内存,而且设备上没有运行其他应用程序

我发现这个代码片段是为了向iOS下的Mach系统询问内存统计信息:

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

static 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);
}
#导入
#进口
静态无效打印\u空闲\u内存(){
主机端口;
机器型号主机尺寸;
虚拟机大小页面大小;
主机端口=马赫主机自身();
主机大小=sizeof(虚拟机统计数据)/sizeof(整数);
主机页面大小(主机端口和页面大小);
虚拟机统计数据虚拟机统计;
if(主机统计信息(主机端口、主机虚拟机信息、(主机信息)和虚拟机统计信息、主机大小)!=KERN\u成功)
NSLog(@“无法获取vm统计信息”);
/*以字节为单位的统计数据*/
使用的自然内存=(vm\u stat.active\u计数+
虚拟机统计非活动计数+
vm_stat.wire_count)*页面大小;
natural_t mem_free=vm_stat.free_count*页面大小;
自然内存总量=已使用内存+未使用内存;
NSLog(@“已使用:%u空闲:%u总计:%u”,已使用、未使用、总计);
}
当我使用这个函数来获取三个内存值时,我发现mem_的总值正在下降,即使mem_使用的总值变化不大。以下是两条连续的输出线:

<Warning>: used: 78585856 free: 157941760 total: 236527616
:已用:78585856免费:157941760总计:236527616
某些代码执行

<Warning>: used 83976192 free: 10551296 total: 94527488
:使用83976192免费:10551296总计:94527488
因此,我的可用内存从157MB增加到10MB,但我的使用量仅从78MB增加到84MB。总内存从236MB减少到94MB

这对任何人都有意义吗?在此期间,设备上没有运行其他应用程序,设备基本上应完全专用于我的应用程序

<>所有在两个内存检查之间执行的代码都是原生C++代码,与任何Apple框架都没有交互。确实有很多调用内存系统来分配和释放C++堆中的对象,但是正如我们看到的,在最后分配的内存中只有大约4MB,所有其他的都被释放/删除。 是否丢失的内存正在被堆碎片消耗?也就是说,堆是否如此分散,以至于块开销消耗了所有额外的、未计算的内存

还有人见过这种行为吗

谢谢


-Eric

您应该使用
task\u info
而不是
host\u statistics
来检索应用程序的内存使用情况:

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

void dump_memory_usage() {
  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( @"task_info: 0x%08lx 0x%08lx\n", info.virtual_size, info.resident_size );
  }
  else {
    NSLog( @"task_info failed with error %ld ( 0x%08lx ), '%s'\n", kerr, kerr, mach_error_string( kerr ) );
  }
}
#包括
#包括
无效转储\内存\使用情况(){
任务\基本\信息;
马赫数、型号、尺寸=尺寸(信息);
kern\u return\u t kerr=task\u info(mach\u task\u self(),task\u BASIC\u info,(task\u info)&info,&size);
if(kerr==KERN_SUCCESS){
NSLog(@“任务信息:0x%08lx 0x%08lx\n”,info.virtual\u size,info.resident\u size);
}
否则{
NSLog(@“任务信息失败,错误为%ld(0x%08lx),'%s'\n',克尔,克尔,马赫错误字符串(克尔));
}
}

Eric,你在什么地方找到这个问题的答案了吗?我正在努力解决一些类似的问题(但以一种完全不同的方式实现),我想知道IOS是如何处理堆碎片的。不,我从来没有收到过关于这个问题的明确答案,但在其他论坛和其他博客文章中,我发现这种查看内存的技术并不是真正有效的。也就是说,返回的值不一定告诉您有关特定应用程序的任何信息,除非是以一般方式。数字的趋势很重要,但特定的值没有多大意义,特别是因为“总数”数字是如此多变,尽管事先人们会认为它应该是固定的。不久前,但是……运行该代码并与XCode的内存配置文件的输出进行比较,显示出大约30兆的相当一致的不匹配(也就是说,XCode显示的使用量比任务信息少了约30兆)-知道原因吗?idk,但可能(只是暗中猜测)XCode显示与堆分配相关的统计信息(通过一些隐藏函数,如
mallinfo
),和
task_info
返回进程通过
mmap
获取的内存量,显然可以更大。这听起来很合理;我到目前为止看到的是,它至少没有报告比XCode使用更少的内存(我认为这可能更准确)加上sysctl报告的设备总内存稍低,我仍然可以在我的应用程序中显示相当好的“内存压力”,用于测试和监控…Thx用于指出任务信息;但是您能帮助回答我的相关问题吗?