1

어떻게 작동하는지 알기 위해 시작 버튼이있는 간단한 iPhone 응용 프로그램을 작성했습니다. 작업을하는 버튼을 트리거 누르면 수행하는 다음NSURLConnection 및 dispatch_async를 사용할 때의 메모리가 공개되지 않음

+ (void)ReportMemory { 
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) { 
    NSLog(@"Memory in use: %u kB", info.resident_size/1024); 
} else { 
    NSLog(@"Error with task_info(): %s", mach_error_string(kerr)); 
} 

}

나는 글로벌 큐가 가지고 읽었습니다 :

- (IBAction)start:(id)sender { 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    @autoreleasepool { 
     NSString *urlString = @"http://www.aftonbladet.se"; 
     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; 
     NSHTTPURLResponse *response = nil; 
     NSError *error = nil; 
     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
     if (error) { 
      NSLog(@"Error: %@", [error localizedDescription]); 
     } 
     if (data) { 
      NSLog(@"Data length: %d", [data length]); 
     } 
     if (response) { 
      NSLog(@"Status code: %d", [(NSHTTPURLResponse*)response statusCode]); 
     } 
     [ViewController ReportMemory]; 
     } 
}); 

}

ReportMemory 기능은 다음과 같습니다 autorelease 풀하지만 그들은 간헐적으로 비우는, 그래서 둘 다 시도하고 @autoreleasepool 매크로 않고 시도하고 메모리 차이에 관해서 어떤 차이를 볼 수 없습니다 이자형.

문제는 ReportMemory가 시작 버튼을 누를 때마다 사용되는 메모리가 점점 더 많아지는 이유는 무엇입니까? 나는 자동 릴리즈 풀이 어느 시점에서 비워 질 것이라고 생각했을 것이다. 하지만 제 경우에는 몇 가지 메모리 경고가 나올 때까지 계속해서 더해지며 ReportMemory가 400MB 정도 사용한다고보고하면 응용 프로그램이 종료됩니다.

이와 같은 sendSynchronousRequest의 사용은 데모 용입니다.

+0

'[ViewController ReportMemory];'로 전화를 이동하여 설정 한'@ autoreleasepool '외부 *로 이동하십시오. –

+0

메모리 사용량과 관련하여 아무런 차이가 없지만 버튼을 누를 때마다 커집니다. 그러나 실제 요청이 완료되기 전에 메모리 사용량을 인쇄합니다. – JugsteR

+0

Instruments의 Allocations 템플릿을 사용해 보셨습니까? 특히, 프로그램을 실행하고 버튼을 한 번 클릭하여 (OS 캐시를 미리 예열) 힙샷을 만든 다음 다시 클릭하고 두 번째 힙샷 (실제 테스트 실행)을 수행 한 다음 조금 기다렸다가 할당되지 않은 것을 확인합니다. 테스트 간격 동안 릴리스되었습니다. – ipmcc

답변

1

사용자가 할당 계기에 게시 한 코드를 실행했는데,이 메서드의 단일 호출로 볼 수있는 유일한 힙 증가는 HTTP 쿠키 저장소에서 발생합니다. 분 정도 그것을 두드리는, 힙 할당이처럼 보였다 :

Instruments Heap Trace

을 한마디로, 네, 그것은 성장하지만, 가끔씩은 축적 된 자원의 무리를 해제합니다. 나는이 코드에 의해 포착되지 않는 다른 일이 있다고 의심합니다. Instruments에서 (전체) 앱을 실행하고 진행 상황을 확인해야합니다.

+0

ReportMemory가보고 한 메모리 사용량이 실제로 감소했는지 확인 했습니까? 나는하지 않는다. 그리고이 응용 프로그램을 가지고있는 실제 응용 프로그램이 다소 진보 된 것 같다고 생각하지만, 이것은 동일한 동작을 보여줄 수있는 가장 간단한 예입니다. 고급 응용 프로그램에서는 ReportMemory를 약 30M에 배치하고 거기에 머물러 있습니다. 이 동작을하는 코드 조각을 제거한 것입니다. – JugsteR

+1

인스트루먼트는'task_info_t.resident_size'보다 효과적인 메모리 사용을 나타내는 * 더 나은 지표가 될 것입니다. 나는 그것을 사용하는 나의 제안을 반복한다.특히, 힙 및 VM 페이지 (다른 프로세스에서 프로세스에 매핑 된 페이지 제외)와 같은 모든 할당의 호출 스택을 알려주며 증가하는 메모리 사용량에 기여합니다. – ipmcc

+0

나는 그것을 깨닫는다. 그리고 나는 어느 정도 동의한다. 하지만 그건 내 질문이 아니야. 이 질문은 ReportMemory에 대한 것이며, 결코 감소하지 않습니다. 또한 응용 프로그램이 종료되는 방식은 ReportMemory가 말하는 것보다 일치합니다. ReportMemory가 할당 된 400MB라고 말하면 응용 프로그램이 종료됩니다. 이 시점에서 Instruments는 누출없이 할당 된 10MB 미만을 보여줍니다. 내 응용 프로그램 사용자에게 그 점을 거의 알리지는 못합니다. "메모리 부족으로 종료되었지만 인 스트 루먼트는 10MB 만 보여줍니다." – JugsteR