为什么当我清空数组时内存没有被释放



这段代码告诉我当前消耗的内存量:

-(u_int)memoryUsage {
    u_int result = 0;
    struct 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 ) {
        result = (info.resident_size / 1024) / 1024;
    } else {
        NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
    }
    return result;
}

为了测试这一点,我写了这样的文章:

NSLog(@"USAGE: %u mb",[self memoryUsage]);
NSMutableArray *array = [NSMutableArray array];
for (int i = 0; i < 1000000; ++i) {
   [array addObject:@"Hello!"];
}
NSLog(@"USAGE: %u mb",[self memoryUsage]);
[array removeAllObjects];
NSLog(@"USAGE: %u mb",[self memoryUsage]);

输出为:

5 mb
10 mb
10 mb

在制作了一个包含1000000个字符串的数组后,内存增加了5mb。但是在清理完它之后,内存使用情况不会被修改。

为什么?

通常,从程序中释放内存分配不会将内存返回到操作系统。内存分配系统保留释放的内存,以便在以后的分配中使用。

最新更新