2014-10-16 2 views
9

장치에 악기를 사용하여 메모리가 누출되었거나 버려 졌는지 확인하려고합니다. 특히 나는 누수와 할당을 사용하고 있습니다. 악기가 누출을 지적하지는 않지만 그것이 내가 기억 문제가 없다는 것을 의미하지는 않습니다. 나는이 일을 몇 주 동안 해왔고, 나는 내가 가진 이슈를 알아내는 것에 더 가깝지 않은 것 같다.계측기 및 힙 (heap) 성장, 실제로 성장이 누출되었을 때?

조치 후에 힙샷을 찍어 반복하여 특정 작업을 테스트하고 있습니다. 처음 몇 세대에 걸쳐 "정착 (settling)"을 거친 후, 나는 성장과 지속 된 숫자가 모두 특정 숫자 (몇 킬로 비트)에서 시작한다는 것을 알 수 있습니다. 많은 반복 된 반복 (예를 들어 10-20) 후에 일부 (전부는 아님)가 천천히 0으로 유출됩니다. 그러나 시간이 좀 걸립니다. 스택 트레이스가 모든 시스템 라이브러리를 보여주기 때문에, 영속적 인 메모리가 남아있는 세대는 내가 실제로 도움이되는 것을 보여주지 못한다.

그래서 내 질문은 :

  1. 이러한 유형의 행동은 무엇을 나타 냅니까? 메모리 문제가 있습니까? 일부 유형의 메모리 누출은 어딘가에 있습니까?
  2. 영구 메모리를 보여주는 반복의 바다에서 힙 힙이 반복되는 것을 의미하는 것은 무엇입니까?
  3. 특정 세대의 스택 추적에서 시스템 라이브러리 만 가리키는 경우 해당 세대의 힙 성장이 유효하거나 버그가 있음을 의미합니까? 아니면 내 끝 부분에있는 기억에 뭔가가 있다는 것을 의미 할 수 있습니까?
  4. 스택 트레이스가 라이브러리와 메소드를 보여 주지만 시스템 코드와 같이 회색으로 표시되고 집 아이콘이 작고 라이브러리 및 검정색과 작은 메소드가있는 라인이있는 것은 무엇을 의미합니까? 상?
  5. 주기를 유지하는 것과 같은 일관성있는 성장이 유지되지 않습니까?

통찰력에 대한 답변은 매우 유용 할 것입니다.

+0

이것을 알아 냈습니까? 나는 새로운 컨트롤러를 많이 할당 할 때 똑같은 것을 보게된다. –

+1

얼마간의 고투 끝에 나는 20-30 회 반복 한 후에도 힙이 한 번 성장했다는 것을 알게되었다. 내가 배정한 모든 배정은 시스템 라이브러리에서 나온 것이었고, 발생한 메모리는 그다지 많지 않았습니다. 좋은 답변이 아닙니다. 알아요. 누군가 다른 사람이 차임을하면 좋을 것입니다. – dragonflyesque

+0

상황이 충분히 빨리 풀리지 않는 어딘가에 루프가있을 수 있습니다. @autorelease에서 그 단단한 루프를 감싸십시오. – uchuugaka

답변

1

나는 당신의 질문에 자상 할게요 :

이러한 유형의 행동은 무엇을 나타 냅니까? 메모리 문제가 있습니까? 어딘가에 메모리의 일부 유형의 게으른 릴리스입니까?

시스템 프레임 워크가 자신의 개인 메모리 요구 사항을 관리하는 방법 당신이 알 수 없기 때문에, 당신은 예, 게으른/당신은 시스템 프레임 워크를 호출 언제든지 일어나고 메모리의 출시 지연이있을 수 있다고 가정해야하는 대부분의 앱은 "항상"입니다. 그것을 배제 할 수 없을뿐만 아니라 확실히 일 것입니다. 겉으로보기에는 무해한 시스템 프레임 워크 사용으로 인해 오래 지속되는 할당입니다. (예는 this answer에있는 UIWebView의 수명이 긴 메모리 사용의 설명을 참조하십시오.)

을 지속적으로 메모리를 보여 반복의 바다에서, 하나 개의 제로 힙 성장 반복은 무엇을 의미합니까?

말하기 어렵습니다. 첫 번째로 좋은 추측은 반복과 관련된 힙 성장이 이전 반복에 할당 된 메모리의 지연/지연 릴리스에 의해 어떻게 든 상쇄되었다는 것입니다.

특정 세대의 포인트에만 시스템 라이브러리에 에 대한 스택 추적이 그 생성을위한 힙 성장이 유효 또는 버그가 있음을 의미하는 경우

? 아니면 내 마지막에 메모리에 뭔가가 있다는 것을 여전히 의미 할 수있는 일까요?

인스트루먼트에 힙 증가가 표시되면 해당 힙 증가가 거의 확실합니다. 힙 성장이 직접 제어 할 수있는 것인지 여부가 다릅니다. 시스템 프레임 워크에 전화를 걸지 않으면 (틀림없이) 분명히 자신의 잘못입니다. 일단 시스템 프레임 워크에 호출하면 프레임 워크가 호출이 반환 된 후에도 할당 된 메모리를 할당 할 가능성이 있음을 인정해야합니다.

에 라이브러리 및 방법과 AA 라인 대, 스택 추적이 라이브러리 및 방법을 보여 주지만,이 시스템 코드와 같은 회색 하고 작은 집 아이콘이 때 그것은 무엇을 의미 을한다 검은 색이고 조금있다 사람 아이콘?

회색으로 표시된 라인은 장비에 해당 라인에 대한 디버그 기호가 없음을 나타냅니다. 그게 다야. 메모리 사용과 관련하여 특별한 것을 나타내지는 않습니다.

주기가 유지되는 경우 - 지속적인 성장이 일관되지 않습니까? 각 반복주기가 유지와 새로운 객체 그래프를 만든 경우

, 다음 네, 각 반복 적어도 객체 그래프의 크기에 따라 힙 성장을 일으킬 것으로 기대. 즉, 작은 개체 그래프는 "노이즈"에서 쉽게 사라질 수 있습니다. 의심스러운 점이 있다면, 한 가지 방법은 "용의자"클래스의 객체가 "노이즈"에서 눈에 띄는 큰 할당을 수행하도록하는 것입니다. 예를 들어, 모든 인스턴스에 대해 객체 malloc을 메가 바이트 (또는 그 이상)로 만듭니다. 그리고 인스턴스가 할당 해제 될 때 해제하십시오. 이렇게하면 문제가있는 영역이 원래 존재하지 않았던 부분을 찾아 낼 수 있습니다.

+0

철저한 답변을 보내 주셔서 감사합니다. 내가 제안한 디버깅 방법을 시도해보고 내 결과로 돌아옵니다. – dragonflyesque

관련 문제