読者です 読者をやめる 読者になる 読者になる

メモリー使用量の謎(2)

SysStats Lite iPhone技術情報

アプリに添付しているドキュメントに、メモリ使用量の取得方法について、以下の通り説明しています。

アプリ添付ドキュメントからの抜粋

メモリの使用状況を、数値と円グラフで表示します。表示されている数値は、host_statistics()関数のHOST_VM_INFOで取得した、vm_statistics構造体メンバの値をメガバイトに換算したものです。

空き free_count
固定中 wire_count
現在使用中 active_count
現在非使用中 inactive_count
確保中 wire_count + active_count + inactive_count
測定可能値合計 空き + 確保中
測定できない領域 物理メモ リサイズと測 定可能値合計の差分

物理メモリサイズは、sysctl()関数のCTL_HW + HW_MEMSIZE(hw.memsize)で取得した値を使用しています。
実際の値は、常に、116MBのようです。

次のバージョンについて - The iPhone Development Playgroundで、この測定できない領域の存在について説明しましたが、さらにわかったことがあるので、報告します。
今回のバージョンアップで、画面の自動更新機能を追加しています。それによって、メモリ解放処理を実行中のメモリ使用状況の変化を見ることができます。
Ver.1.1のスクリーンショットを以下にアップロードしましたので、見てください。
SysStats Lite 1.1のスクリーンショット(スライドショー)
スライドショーを見れない方は、こちらでどうぞ
これは、メモリ解放処理を実行した時の画面の動きをスライドショーにしたものです。
各画像は以下の状態です。

  • 1枚目: 実行開始前
  • 2〜6枚目: メモリ解放処理実行中
  • 7, 8枚目: 処理完了後

ここで注目すべきは、「2〜6枚目: メモリ解放処理実行中」の、灰色部分の変化です。
メモリ解放処理は、

アプリ添付ドキュメントからの抜粋
この機能は、一時的に大きいサイズのメモリを確保して、メモリ不足の状態を作ったときに起こる副作用を利用しています。
256kbyteずつメモリを確保して行きます。確保した容量と空きメモリの和が期待している空き容量に達するまで、その処理を繰り返した後、確保したメモリを解放します。

といった方法で実現していますが、ここでメモリをどんどん確保する過程で増えて行くのは、灰色で示している測定できない領域だったのです。残念ながら、host_statistics()関数で取得できる数値は、本来の要件を満たしていないことになってしまいますね。
裏を返すと、やはり、メモリ解放処理の前後比較においては、下側の円グラフ(現行バージョンで表示しているグラフと同じもの)を使うのは適切でないようですね。次のバージョンについて - The iPhone Development Playgroundでも述べた通り、母数が違う円グラフの比率の変化を比較しているわけですから。。。
残念ながら、現時点では、現行バージョンで表示している円グラフは、直感的に空きメモリが多いか少ないかを把握するレベルの補助的な位置づけになってしまっています。
現行バージョン(1.0.1)を使っていただいている方は、次バージョンが出るまでは、数値を中心に見ていただく方がいいかと思います。
ご不便をおかけしますが、次バージョンが出るまで、もうしばらくお待ちください。

ご意見、ご不明点などありましたら、コメントいただければと思います。