iPhone OS 메모리 경고. 다른 수준은 무엇을 의미합니까?


85

iPhone OS 기기에서 메모리를 관리하는 블랙 아트에 대해 : 다양한 수준의 메모리 경고가 의미하는 것은 무엇입니까? 레벨 1? 2 단계? 다이얼이 11 번으로 가나 요?

컨텍스트 : iPod 음악 플레이어 앱이 재생되는 상태에서 iPad 앱을 실행하는 것을 포함하여 광범위한 메모리 스트레스 테스트 기간을 거친 후, 수신되는 무작위이지만 드물게 나타나는 메모리 경고를 무시하는 경향이 있습니다. 내 앱 이 충돌 하지 않습니다 . 이제까지. 내 앱은 유출이 없습니다. 그리고 mems 경고는 중요하지 않은 것 같습니다.

고마워,
더그

답변:


98

기본적으로 경고는 장치의 메모리가 부족 하다는 것을 의미하며 , "만약 당신이 적극적으로 사용하지 않는 메모리를 확보 할 수 있다면 그것은 부풀어 오를 것입니다! "라는 의미입니다. 메모리 관리가 빡빡하고 실제로 버릴 수있는 개체가없는 경우 메시지를 전달하고 무시하십시오.


25
LOL "활기차게 사용하지 않는 메모리를 좀 비워 주시면 부풀어 오를 것입니다!" 귀중한 ;-) 건배
dugla

15
당신은 아이폰 OS의 엉뚱한 메모리 댄스의 노련한 베테랑처럼 들립니다.
dugla

193

메모리 수준 경고는 SpringBoard에 의해 기록됩니다. 앱 개발자는 신경 쓸 필요가 없습니다. 응답만으로 -{application}didReceiveMemoryWarning충분합니다.


경고에는 4 단계 (0 ~ 3)가 있습니다. 이는 커널 메모리 감시자에서 설정되며 not-so-public 함수OSMemoryNotificationCurrentLevel() 로 얻을 수 있습니다 .

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;

레벨이 트리거되는 방법은 문서화되어 있지 않습니다. SpringBoard는 각 메모리 레벨에서 다음을 수행하도록 구성됩니다.

  1. 경고 (비정상) — 메일과 같이 불필요한 백그라운드 앱을 다시 시작하거나 자동 다시 시작을 지연합니다.
  2. 긴급 — 모든 백그라운드 앱 (예 : Safari 및 iPod)을 종료합니다.
  3. Critical and beyond — 커널이 인수되어 SpringBoard를 죽이거나 재부팅 할 수도 있습니다.

활성 앱 (jetsam)을 종료하는 것은 SpringBoard에서 처리하지 않고 launchd.


감사합니다. 이 질문에 대해 당신과 코미디언 윌리 함 사이에 던져졌습니다. 유머가 이깁니다. 건배.
dugla

안녕하세요, 같은 문제가 있습니다. 애플리케이션을 5 회 이상 계속 실행 한 후 Received memory 경고가 표시됩니다. 20 회 동안 레벨 = 1이지만 애플리케이션이 충돌하지 않습니다. 하지만이 메시지를 받으면 메모리 경고를 받았습니다. Level = 2 내 응용 프로그램이 충돌합니다. Level2는 Level1이 거의 20 번 나타난 후에 나타납니다. 애플리케이션이 충돌하지 않도록하려면 어떻게해야합니까? 주셔서 감사합니다
스리 칸스 rongali

1
@Kenny : 적은 메모리는 우리가 최대를 얼마나 사용할 수 있는지를 의미합니다. 얼마나 많은 라이브 바이트를 가질 수 있습니까? 내 충돌 로그에서 나는 이것을 얻었다. 무료 페이지 : 371 유선 페이지 : 12192 제거 가능한 페이지 : 0 최대 프로세스 : DTMobileIS이게 무슨 뜻입니까? 내가 돌봐야 할 곳은? 감사합니다.
srikanth rongali

9
@srik : 새로운 질문을하는 것이 좋습니다 .
kennytm

@kennytm : ios8에서도 여전히 가능합니까? 함수가 libsystem_c.dylib. 계속해서 사용할 수 있다면 좋을 것입니다. 감사합니다
focs

12

에서 OSMemoryNotification.h ,

/*
** Threshold values for notifications
*/

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;

totoal 5 레벨의 메모리 경고 (-1,3).

메모리 수준 경고 설명과 관련하여 @KennyTM의 대답은 훌륭합니다.

PM과 다른 사람들에게 도움이 될 수있는 몇 가지 관련 사항을 추가하고 싶습니다.


메모리 수준 경고가 발생하면 어떻게해야합니까?

이러한 경고 중 하나를 수신하면 처리기 메서드는 불필요한 메모리를 즉시 확보하여 응답해야합니다. 예를 들어, UIViewController 클래스의 기본 동작은 해당 뷰가 현재 표시되지 않는 경우 해당 뷰를 제거하는 것입니다. 하위 클래스는 추가 데이터 구조를 제거하여 기본 동작을 보완 할 수 있습니다. 이미지 캐시를 유지하는 앱은 현재 화면에없는 이미지를 해제하여 응답 할 수 있습니다.


메모리 레벨 경고를 관찰하는 방법은 무엇입니까?

에서 http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html

시스템이 앱에 메모리 부족 경고를 전달하면 즉시 응답하십시오. iOS는 사용 가능한 메모리 양이 안전 임계 값 아래로 떨어질 때마다 실행중인 모든 앱에 알립니다. (일시 중단 된 앱에 대해서는 알리지 않습니다.) 앱에서이 경고를 받으면 가능한 한 많은 메모리를 확보해야합니다. 이를 수행하는 가장 좋은 방법은 캐시, 이미지 개체 및 나중에 다시 만들 수있는 기타 데이터 개체에 대한 강력한 참조를 제거하는 것입니다.

UIKit은 다음을 포함하여 메모리 부족 경고를 수신하는 여러 방법을 제공합니다.

  • 앱 대리자의 applicationDidReceiveMemoryWarning : 메서드를 구현합니다.
  • 사용자 지정 UIViewController 하위 클래스에서 didReceiveMemoryWarning 메서드를 재정의합니다.
  • UIApplicationDidReceiveMemoryWarningNotification 알림을 수신하려면 등록하십시오.

앱의 메모리 공간을 줄이는 방법은 무엇입니까?

  • 메모리 누수를 제거합니다.
  • 리소스 파일을 가능한 한 작게 만드십시오.
  • 대용량 데이터 세트에는 Core Data 또는 SQLite를 사용하십시오.
  • 리소스를 느리게로드합니다.
  • Thumb 옵션을 사용하여 프로그램을 빌드하십시오.

자세한 내용은 http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html참조하십시오.


메모리를 현명하게 할당하는 방법은 무엇입니까?

  • 자동 해제 된 객체 사용 줄이기 : 자동 참조 계수 (ARC)를 사용하면 객체 를 할당 / 초기화하고 컴파일러가 적절한 시간에이를 해제하도록하는 것이 좋습니다. 이는 과거에 현재 메서드의 범위를 벗어나는 것을 방지하기 위해 자동 해제 된 임시 개체의 경우에도 마찬가지입니다.
  • 리소스에 크기 제한 적용 : 작은 리소스 파일이로드되는 경우 큰 리소스 파일을로드하지 마십시오. 고해상도 이미지를 사용하는 대신 iOS 기반 장치에 적합한 크기를 사용하십시오. 대용량 리소스 파일을 사용해야하는 경우 지정된 시간에 필요한 파일 부분 만로드하는 방법을 찾으십시오. 예를 들어, 전체 파일을 메모리로로드하는 대신 mmap 및 munmap 함수를 사용하여 파일의 일부를 메모리 안팎으로 매핑합니다. 파일을 메모리에 매핑하는 방법에 대한 자세한 내용은
  • 제한되지 않은 문제 집합 방지 : 제한되지 않은 문제 집합은 계산하는 데 임의로 많은 양의 데이터가 필요할 수 있습니다. 세트에 사용 가능한 것보다 더 많은 메모리가 필요한 경우 앱에서 계산을 완료하지 못할 수 있습니다. 앱은 가능한 한 이러한 세트를 피하고 알려진 메모리 제한 문제를 해결해야합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.