SysStats Monitor の問題修正版がリリースされました

ご利用いただいているみなさまには、大変ご迷惑をお掛けしておりましたが、先日、
【お詫び】SysStats Monitor2.1の不具合について - The iPhone Development Playground
にて報告した問題を修正したバージョン2.1.1が、本日、リリースされました。

同じようなことが起きないよう、気を引き締めて参りますので、今後とも、よろしくお願いいたします。

>SysStats Monitor2.1 has an problem

Last night, SysStats Monitor 2.1 was released in AppStore. However an problem was found, which any process names was not shown in the process list view.

I already submitted the bug fixed version as 2.1.1 to Apple.
And could you suspend update this app until 2.1.1 will be released.

Let me tell you further that iPad version and free version of this app, SysStats Lite, does not have this problem, so you can use normally.

I am afraid it may be inconvenient, but please wait a little longer.

【お詫び】SysStats Monitor2.1の不具合について

昨晩、SysStats Monitor 2.1をAppStoreにリリースしましたが、こちらの手違いにより、プロセス一覧画面で、プロセス名が表示されないという不具合があることが判明しました。

すでに、当該不具合を修正したバージョン2.1.1を、Appleに申請しましたので、リリースまで、しばらくお待ちいただければと思います。
あと、できれば、2.1.1がリリースされるまで、アップデートを控えていただけると助かります。

尚、この不具合は、iPad版と、無料版であるSysStats Liteでは発生しておりませんので、そちらは問題なくご使用いただけます。

以上、みなさまにはご迷惑をお掛けしますが、よろしくお願いいたします。

iTunesのファイル共有機能を使えるようにしてみました

SysStats Monitorでは、次のバージョンで、iTunesのファイル共有機能をサポートするようにしてみました。

ファイル共有機能がどういうものなのかについては、以下の記事がわかりやすいと思います。

iWork for iOS:iTunes のファイル共有について

iPadのこととして書かれていますが、iOS4からは、iPhoneでも同じようにできますね。

アプリ側はどういうことするかというと、Info.plistの"Application supports iTunes file sharing"をYESにするだけです。これによって、iTunes経由でアプリのDocumentsディレクトリとコンピュータ間でファイルをコピーすることができるようになります。

SysStats Monitorの場合は、保存しているデータは少ないので、この機能を入れるメリットはあまりなく、試験的な意味合いで入れてみたという面も、正直なところあります。
結局のところ、再起動履歴が保存されているsqliteファイルのバックアップ/リストアが可能になるという、地味な機能追加となっています。

将来的には、もう少し何か意味のあるデータのやり取りができるようになればいいなと考えています。

ただ、1つ、気になる問題もあります。壊れたデータがリストアされてしまうと、アプリが起動できなくなったりすることもありうるわけで、ユーザのみなさんにも注意していただく必要があるかなと思います。

iPhoneの空きメモリがだんだん減って行くのはなぜか?

iOSでは、モバイルデバイスの限られたリソースや操作感を前提に、独自のマルチタスキング環境が実現されています。
ユーザから見たその特徴は、

  • アプリをすばやく切換えられる(Fast app switching)。
  • 再度呼び出した時に、前回の状態が維持されいて、操作を継続できる。

と、いったところが大きいですね。

例えば、

  • メールの中のリンクをタップしてSafariを起動して、Webサイトを見る。
  • また、メールに戻る。
  • もう一度Safariで先程見ていたものを見る。

といった一連の動作をスムーズに行えるようにするような感じです。
でも、ここまではOS3.xでもできていましたよね。

iOS4では、こういう能力を、他の標準アプリや、AppStoreで販売される一般のアプリにも広げたのだと、私は理解しています。

ちなみに、どうやってアプリを終了させるの? という質問ヘの回答は「終了させる必要はない」(スコット)「ユーザがそんなことを考える必要はないはずだ」(ジョブズ)。

iPhone OS 4はマルチタスク対応、バックグラウンドでSkypeも動作 - Engadget Japanese

上記の会話からは、「実際に終了させるべきタイミングは、OSが判断するから気にしなくていいよ。」というメッセージが伝わってきます。
でも現実には、そこまで言えるほど、うまくできあがっていないんじゃないかということを、多くのユーザは感じているのではと思います。

なぜなら、バックグラウンド化に対応したアプリのプロセスは、特定の制御条件に達するまで、終了されずに溜まって行くので、普通に使っていると、だんだん空きメモリが減って行くからです。
あと、連続使用している時間の長さとは、基本的に相関関係はなく、使い方によるところが大きいということになります。
当たり前と言えば、当たり前のことですが。。

ユーザが不満を感じるところは。。?

iOSは、アクティブなアプリが何かしようとしたタイミングで、空きメモリが足りないと判断された場合に、バックグラウンドで一時停止状態になっているアプリケーションプロセスの中で、終了させてもいいと判定されたものを強制終了するといった制御をしています。

id:paellaさんからいただいたコメント(空きメモリが少ない時に、iPhoneの中で何が起きるのか、また調べてみました。 - The iPhone Development Playground) にて、終了させてもいいという判定基準は、以下の通りとなっていることがわかりました。*1

WWDC2010のスライドで、バックグラウンドのアプリが殺される優先度として
1) 多量のメモリを使用しているSuspended状態のアプリケーション
2) 多量のメモリを使用しているRunning状態のアプリケーション
3) Suspended状態のアプリケーション
4) Running状態のアプリケーション
と記述されていますね。

この制御が、本当に空きメモリが足りなくなった時に初めて行われるという点が、ユーザに「もっさり感」を与え、不満を感じさせる原因かもしれません。

ユーザの判断で終了させたい時は、マルチタスキングバー(最近使ったアプリケーションのアイコンリスト)*2から、対象のものを選択して削除することができるのは、多くの方がご存知ですね。でも、そこにあるものがすべてバックグラウンドに存在しているとは限らないところが、残念です。そういうものを削除しても全く効果はありませんので。。

不要なプロセスは自分で選んで終了させよう - The iPhone Development Playground

PCであれば、ユーザがアプリをバックグラウンドで活かしておくか、終了させるのかを簡単に選択することができますが、iOSではちょっと面倒な操作と判断が必要です。
そこで、iPhone4になった今も、多くのユーザが、「空きメモリが足りないと判断される状況」を、自発的に作り出す「メモリ解放機能」を持ったアプリを求めるのかなと思っています。

解決するためには。。?

マルチタスキングバーで、バックグラウンドプロセスとして、存在してるかどうかを見えるようにしてくれることが、最良の解決策だと私は思います。ついでに、各プロセスのメモリ使用量が見えるようにしてくれればさらにありがたいですね。
でも、現時点ではAppleの方針とは合わないと思われるので、実現はむずかしいかもです。

では、視点を変えて、アプリ開発者側に、何かできることはあるでしょうか?

アプリの要件として、バックグラウンドで待機する必要ないのであれば、バックグラウンド化はさせないようにすることで、一定の抑止効果は得られると思います。
SysStats Monitorの場合、操作の継続性がなく、バックグラウンド化することに意味が無いので、しない設定にしています。
反対に、写真を編集するようなアプリは、編集途中で電話をうけた場合などに備えて、バックグラウンド化に対応しておくべきでしょう。

この設定はアプリ単位の静的なプロパティであり、動的に切換えることはできないので、簡単には決めにくいかもしれませんね。
(デフォルトはバックグラウンド化する設定になっているので、注意が必要ですね)

Out Of Memory Killerに似てるけど、もう少しやさしいiPhoneOSの空きメモリー制御 - The iPhone Development Playground

ということで、決定的な解決策はありませんが、まずは、現状に納得することも大事なのではと思います。

*1:"Session 105 - Adopting Multitasking on iPhone OS, Part 1"の25ページ

*2:先日(9/1)に行われたiOS4.2発表時のプレゼンで、Steve Jobs氏が "multitasking bar" と言っていたので、今後はこの用語も使用しようと思います。

自分が使っているCPU使用率とメモリ使用量を表示している理由

iPhone 4 PERFECT GUIDE』(ソフトバンククリエイティブ社刊)の201ページに、SysStats Liteを紹介していただいてます。

ソフトバンク クリエイティブ:『iPhone 4 PERFECT GUIDE』紹介アプリのリンク集

iPhone 4 PERFECT GUIDE (パーフェクトガイドシリーズ)

iPhone 4 PERFECT GUIDE (パーフェクトガイドシリーズ)

タイトルは「iPhone4」となっていますが、実際には3GSにも共通な、iOS4の新機能が一通り説明されているので、3GSユーザの方にも有意義な内容になっていると思います。
(私も、この本を読んで、GarageBandを使わなくとも、iTunesだけでオリジナル着信音を作る方法を知りました)

あと、SysStats Liteが自分のメモリ使用量とCPU使用率を表示しているという、細かい機能に注目して取り上げていただいたことが、特に、うれしいですね。
この場を借りて、御礼申し上げます。

ただし、この自分のメモリ使用量とCPU使用率を表示する機能は、他のシステム情報表示アプリケーションにはないものなので、みなさんには、あまり馴染みがないものかもしれません。ご紹介いただいたこともあり、ちょうどいいタイミングなので、これらの値の使い方を、少し詳しく説明してみたいと思います。

注: SysStats Liteとして説明していますが、いずれもSysStats Monitorにもそのまま当てはまる内容です。

CPU使用率

以下の2つの画像は、いずれも、SysStats LiteのスクリーンショットからCPU使用率の部分を抜粋したものです。
「(このアプリ)」と書かれている下の数値(仮にXとします)が、SysStats Lite自身のCPU使用率を表し、その左側の数値(仮にYとします)が、システム全体を表しています。
その場合、概ね、

Y - X ≒ [バックグラウンドプロセスのCPU使用率]

ということになります。

前者は、システム全体(Y)とSysStats Liteの使用率の数値(X)の差が小さいので、バックグラウンドプロセスのCPU使用率がのCPU使用率低めであることを示しています。

反対に後者は、差が少ないので、バックグラウンドプロセスのCPU使用率高めであることを示していますので、何か負荷の高い処理が実行されている可能性があります。ホームボタンをダブルクリックして、「最近使ったアプリケーション」を表示させ、任意のアプリを終了させることで、解消することがあります。
*1

メモリ使用量

こちらは、SysStats Liteのスクリーンショットからメモリ使用量の部分を抜粋したものです。
「このアプリの使用量」の数値は、SysStats Lite自身が使用しているメモリサイズです。

ここで、以下の2つのサイズとその合計値に着目してみてください。
(単位: MB)

空きメモリサイズ このアプリの使用量 合計
スクリーンショット前者 22.6 9.0 31.6
スクリーンショット後者 13.7 16.4 30.1

SysStats Liteは、バックグラウンドに常駐させないように設定されています。ホームボタンをクリックした時に、プロセスが終了しますので、「このアプリの使用量」は、そのときに、そのときに解放される予定のものです。
前者のケースでは、
「現在22.6MBの空きがあり、SysStats Liteが9.0MB使用しているが、SysStats Liteを終了すれば、それらの合計値(31.6MB)の空きメモリがある状態になる。」
ことが想定されます。
そう考えると、この両者の状態には、あまり差がないということが言えると思います。*2


SysStats Liteが自分のメモリ使用量とCPU使用率を表示しているのは、このように、もう少しシステムの状態を詳しく把握できるようになればいいかなと思ったことが、大きな理由です。
また、ちょっと古い話ですが、以下のような状況に遭遇したこともきっかけになっています。

待ち受け状態のiPhoneが熱くなったときの対処例 - The iPhone Development Playground

各バックグラウンドプロセスのCPU使用率とメモリ使用量が取得できれば、もちろん必要ない機能ですが、公開APIでそれらを取得する方法が見つかっていないので、このような形で実現しました。

iPhoneがもっさりしてきたと感じた時は、CPU負荷の問題であることも多いので、再起動などする前に、SysStats Monitor/SysStats Liteでも確認することで、何か原因が見つかることもあります。
興味がある方は、ぜひ、お試しください。

*1:iPhone SDKをインストールしている場合は、Instrumentsというユーティリティに内蔵されているActivityMonitorツールを使用することで、個々のプロセスのCPU使用率を見ることができます。

*2:SysStats Liteで、プロセス一覧や、ヘルプページを表示させると、「このアプリの使用量」が増加し、空きメモリが減ることがあります。

不要なプロセスは自分で選んで終了させよう

iOS4から、一部の古い機種を除き、マルチタスキングがサポートされるようになりました。それによって、アプリの切替が速くなったのはいいですが、反面、待機しているバックグラウンドプロセスが増えたことにより、メモリ使用量が増えたという問題があります。
そんな背景から、iOS4では空きメモリが少なくなることは日常的に起こることなので、その都度再起動して空きメモリを増やすというのは効率が悪く、面倒なことです。
では、iOS4からサポートされた、"First App Switching"は、どうでしょう?
ホームボタンのダブルクリックで、「最近使ったアプリケーション」のアイコンリストを表示してくれます。

すでにご存知の方も多いと思いますが、このアイコンには、「アプリの切替または起動のためのショートカット」以外に、アイコンの長押し後表示される"-"をタップすることで、アイコンを削除するとともに、そのアプリのプロセスが存在していれば終了するという機能を持っています。

せっかく用意されている機能なのに、残念ながら、自分でプロセスを選んで終了させるのを面倒だと感じる方も多いようです。でも慣れてくれば、どれを終了させればいいのか見当がつくようになるので、それほどの手間ではないと思います。特に、コンピュータに詳しい上級ユーザの方であれば、難なくこなせることでしょう。

ここでは、SysStats Monitorを、この「最近使ったアプリケーション」のアイコンリストと組み合せることで、終了させると効果があるプロセスの見当をつける方法を紹介してみたいと思います。

注:
今回は3GSでテストしています。他の機種には当てはまらないこともあります。
プロセスのメモリサイズは、そのアプリの使用状況によってことなるので、常に、ここで示した通りになるわけではありません。

システムの状態を確認する

動きが重いなどの異状を感じた場合、とりあえずSysStats Monitorを起動してみましょう。例えば、以下のような状態であれば、かなりメモリが逼迫していますね。

以下のようなプロセスが、バックグラウンドに存在しているようです。


プロセスを終了させてみる

このまま使っていても問題はないのですが、気になる場合は、不要なアプリのプロセスを終了させてみましょう。

連絡先


3MBほど、空きメモリが増えましたが、効果は薄い感じです。

Safari


37MBほど、空きメモリが増えました。これは効果がありそうですというか、織込み済みですね。
ここまで空きメモリが増えれば、ほとんどの場合充分ですが、テストのために、もう少しやってみます。

バックグラウンドに存在していなかったアプリ

ここで、バックグラウンドプロセスとして存在していなかった、Facebookを削除してみます。

ほとんど変化なしです。恐らくあまり削除する意味は無いでしょう。

Twitter for iPhone

さらに続けて、バックグラウンドに存在していたTwitterを削除してみます。

7MBほど、増えましたが、効果は中途半端な感じですね。

終了したプロセスを確認する。

最後に、この間に終了されたプロセスを確認してみましょう。

ここまでの操作で終了したアプリのプロセスが表示されていますね。

注: 上記の一連の操作の間、SysStats Monitorが起動されたままになっていることが前提です。


こんな感じで調べてみることで、自分なりのプロセス終了パターンを見つけられると思います。
興味がある方はお試しください。