W.I.S. Laboratory
menu-bar

Android


Androidスマホが時々固まったり画面が真っ黒のまま応答しなくなる

結論から書くと、以下の2つを気にかけることでそれなりに改善した。

  • 写真や動画を削除したらその都度ゴミ箱も空にしておく
  • 2週間に一度くらいの頻度で、スリープまでの時間を最長(30分くらい)に設定し、ホーム画面にしたまま30分間放置する(その後はスリープ時間を戻しておく)

Androidスマホを使おうとして電源ボタンを押したり指紋認証しようとするのだが、しばらく反応してくれなかったり、電話がかかってきて取ろうとするのだが画面が真っ黒のままで操作しようにも何もできない、ということが時々ある。
そこまで頻繁に起こるわけでもなく、操作を受け付けない時間は1秒~5秒程度で、そこまで長い時間ではないものの、大切な時に限って起こる気がしてストレスだ。
Androidが遅い原因は多岐に渡るので、原因を突き止めるのはなかなか難しいのだが、3つほど可能性が高そうなものがある。

  1. ゴミ箱の自動整理
  2. ガーベージコレクション
  3. 内蔵ストレージのTrim

AndroidはPCと違って、ゴミ箱に入れたファイルが30日~60日ほど経過すると自動的に消えるようになっている。
空き容量が減ってきて、ある日写真や動画の整理をしたとすると、その60日後にゴミ箱内のファイルをすべて削除する動作を始めるわけだ。
写真や動画の整理というのは毎日コツコツとすることはあまりなく、ある日にまとめて行うことが多いので、当然ゴミ箱内のファイル削除もまとめて実行されることになる。
この時ある程度のファイル数があると、すべて削除するにはそれなりの時間がかかり、その間スマホは応答しにくくなると考えられる。
60日前のことなどまず覚えていないので、突然スマホが遅くなったと感じられても不思議ではない。
ほぼ毎日写真をゴミ箱に入れる作業をしていると、2ヶ月遅れでほぼ毎日スマホの応答が遅くなる現象が発生するということになる。
ということは、写真や動画を削除したその時にゴミ箱も空にしておくと予防になる可能性があるのではないだろうか。

メモリのガーベージコレクション(GC)中も動作が止まる。(人によっては「ガーベジコレクション」といったり「ガベージコレクション」といったりもする。本来の英語だと「ガーベッジコレクション」が近い)
最近ではAndoroidにも参照カウント式のスマートポインタが導入されてきたようだが、アプリによってはまだガーベージコレクタにメモリ解放を任せているものも多くありそうだ。
GCの発動タイミングは実装次第だが、問題はスリープ中に発動するかどうかだ。
スリープ中に発動してGC動作中に電話がかかってきたり、スリープ解除のための指紋認証をしたりすると、GC動作が完了するまではスマホが反応してくれない可能性がある。
GC動作は一度始まると中断することはまずなく、全プロセスが止まる(Stop the world)方式であればなおさら反応が無くなる。

またスマホのストレージはeMMCやUFSといったフラッシュメモリが使われているが、こういうタイプのストレージは少しでも寿命を伸ばすため、データを上書きしたり削除したりするたびにウェアレベリングを行っている。(最近ではウェアレベリングにUFSの寿命を伸ばす効果はないという研究結果もあるようだが)
ウェアレベリングをすればするほど、OSが認識している空き領域とストレージが認識している空き領域が食い違ってくるので、それを揃えるためにTrimが必要になる。
というわけで、Androidはストレージに対して定期的にTrimコマンドを送出している。
Trimコマンドを受け取ったeMMC(UFS)は、ストレージがあまり忙しくない(つまりデータの読み出しや保存があまり行われていない)ときにTrimを実行する。
Trimとは「OSが空き領域だと認識しているブロックを消去する」ということだ。
これもガーベージコレクションと同じく、スリープ中に発動できるかどうかが問題になるが、eMMCやUFSにとってブロックを消去するという作業はかなり時間がかかるので、この間にスワップした内容をメモリに戻そうとするとAndroidがしばらく応答しなくなると考えられる。
頻繁にデータ保存が繰り返されるような局面が多いと、それだけTrimの必要性も増えてくる。

GCもTrimも、スマホを使えば使うほど、動作にかかる時間が長くなる。
例えばYoutubeなどの動画配信を長時間見続けたり、あちこちのSNSやWebを見続けたりしていると、開放対象になるメモリ領域が増え、キャッシュデータの書き込み・上書き頻度が上がってくる可能性があるので、GCに時間がかかるようになり、Trim対象になるブロックがそれだけ多くなると考えられる。
なので時々しっかりとGCとTrimを行う時間をスマホに与えてあげることが必要になってくる。
一度スリープまでの時間を最長(30分くらい)にして、ホーム画面にしたまま放置してあげると、しっかりGCやTrimをしてくれる可能性がある。(その後はスリープ時間を戻しておくこと)

というわけで、時々Androidが固まってしまうというのは、それだけスマホをよく使っているということの裏返しかもしれない。
ただ最初にも書いたが、スマホが遅い・固まるという原因は本当に多岐に渡る。
ストレージの空き容量が極端に少ないとか、アプリを入れすぎてバックグラウンド処理や通知待機処理だけでいっぱいいっぱいになっている(バックグラウンド処理や通知をOFFにすれば良いという単純な問題でもない)ということもあれば、単に故障しているということもある。
バッテリーが底をつきそうなほどになるまで充電せずに使う人は、知らない間に省電力モードがONになっていて、そのまま使っていることもあるし、その逆で頻繁に充電をしてバッテリー残量を100%に近い状態で保ち続けている人は、バッテリーが劣化してしまい、Androidがそのバッテリー性能に合わせて性能を落としているかもしれない。
ただ、スマホの動作速度を遅くさせる要因の多くはメモリ管理やストレージにあると考えられるので、上の2点をまずは気にかけてみるのが良いのではないかと思う。


[ 戻る ]
saluteweb