2

私のアプリケーションでは、いくつかのアクション (画像の選択 + 処理) を数回繰り返してからクラッシュした後、レベル 1 のメモリ警告が表示され、次にレベル 2 のメモリ警告が表示されます。

リーク ツールにはリークは表示されません。また、Instruments の Allocations ツールに従っていますが、Live Bytes は約 4 MB で、全体で 113 MB を割り当てています。画像が読み込まれるとき、最大で 20 MB のメモリが必要です。

クラッシュに到達するためにアクションを繰り返す必要があるため、メモリ リークである可能性が非常に高くなります。ただし、私のライブ バイトは 4 MB であり、割り当てられるはずなので (UIImagePickerController での ~100 KB の小さなリークは別として)、それを見つける方法がわかりません。

メモリ リーク/割り当てツールはどの程度信頼できますか? 問題の原因を突き止めるためのアドバイスをいただけませんか?

4

1 に答える 1

2

iPhone OSがどのように機能するかわからないので、これは基本的に推測ですが、ガベージコレクタがヒープメモリを圧縮しないシステムでは、時間の経過とともに断片化されます。多くのメモリが解放されているからといって、連続したメモリが大量に解放されているわけではありません。

たとえば、処理のために常に4MBのメモリが必要であり、次の割り当てパターンがある場合:

  • 4MBを割り当てる
  • 1KBを割り当てる
  • 無料4MB
  • 1KBを割り当てる

(1KBブロックは計算結果などであるため、解放しません)

最終的には3,999Kの空き連続メモリしかなくなる可能性があります。したがって、次に4MBを割り当てると、ほぼ収まるとしても、ギャップの後に配置されます。これは、メモリのほぼ全体(つまりアドレス空間)が空いている場合でも、メモリが不足する可能性があることを意味します。

確かに、最近のシステムではこの問題が発生することはありませんが、特にアプリケーションがシャットダウンされず、圧縮ガベージコレクターがない場合は問題が発生する可能性があります。一部のシステムでは、特にこのような状況(同じサイズのブロックの再割り当てと解放)の場合、断片化の少ないヒープがありますが、通常は明示的に要求する必要があります。

于 2010-05-27T16:21:45.970 に答える