Androidプロセスの優先順位とLowMemoryKillerメカニズム-1

3095 ワード

プロセスライフサイクル
Androidシステムはできるだけ長時間アプリケーションプロセスを維持し、ユーザーアプリケーションが終了した後、アクティブにプロセスkillを落とさなければ、そのプロセスはシステムにキャッシュされ、ユーザーが再びAppを起動すると、起動が加速します.開くアプリケーションが増えるにつれて、システムメモリが不足し(Out of Memory)、新しいプロセスを作成したり、より重要なプロセスを実行したりするために、最終的には古いプロセスを削除してメモリを回収する必要があります.どのプロセスを保持または終了するかを決定するには、プロセスで実行中のコンポーネントとそのコンポーネントのステータスに基づいて、各プロセスを重要階層に配置します.必要に応じて、システムはまず重要度が最も低いプロセスを除去し、次に重要度がやや劣るプロセスを除去し、このようにしてシステムリソースを回収します.LowMemoryKillerメカニズムは,プロセスを殺す必要があるか,どのプロセスを殺す必要があるかを判定するシステムのメカニズムである.
システム内のプロセスの優先度は5段階に分かれています.
  • フロントプロセス(Foreground process)ユーザの現在の操作に必要なプロセス.プロセスが次のいずれかの条件を満たす場合は、フロントプロセスとみなされます.
  • は、ユーザが対話中であるActivity(Activityが呼び出されたonResume()メソッド)
  • を含む
  • は、ユーザが対話中であるActivity
  • にバインドされたサービスを含む.
  • には、「フロント」で実行中のサービス(startForeground()が呼び出された)
  • が含まれています.
  • には、ライフサイクルコールバックを実行しているサービス(onCreate()、onStart()またはonDestroy()の
  • が含まれています.
  • は、そのonReceive()メソッドを実行するBroadcastReceiver
  • を含む
  • Visibleプロセス(Visible process)にはフロントコンポーネントはありませんが、画面上でユーザーが表示するコンテンツのプロセスには影響します.プロセスが次のいずれかの条件を満たす場合は、可視プロセスとみなされます.
  • は、フロントにいないがユーザに見えるActivityを管理する(onPause()メソッドが呼び出された).たとえば、フロントActivityがダイアログボックスを起動し、前のActivityを後で表示できるようにした場合に発生する可能性があります.
  • は、可視(またはフロント)Activityにバインドされたサービスを管理します.

  • すべてのフロント・プロセスを同時に実行するために終了する必要がない限り、システムはこれらのプロセスを終了しません.
  • サービスプロセス(Service process)は、startService()メソッドを使用して開始されたサービスを実行しており、上記の2つ以上のカテゴリのプロセスに属していないプロセスです.サービスプロセスは、ユーザが見ているコンテンツと直接関連付けられていないが、通常、バックグラウンドで音楽を再生したり、ネットワークからデータをダウンロードしたりするなど、ユーザが関心を持っている操作を実行している.したがって、すべてのフロント・プロセスと可視プロセスが同時に実行されるようにメモリが不足しない限り、サービス・プロセスは実行されます.
  • バックグラウンドプロセス(Background process)は、現在ユーザに対して見えないActivityのプロセス(Activityが呼び出されたonStop()メソッド)を含む.これらのプロセスはユーザー体験に直接影響を及ぼさず、フロントプロセス、可視プロセス、またはサービスプロセスで使用するためにメモリを回収するために、システムがいつでも終了する可能性があります.通常、多くのバックグラウンド・プロセスが実行されるため、ユーザーが最近表示したActivityを含むプロセスが最後に終了したことを確認するために、LRU(最近最小使用)リストに保存されます.Activityがライフサイクルメソッドを正しく実装し、現在のステータスを保存している場合、ユーザーがActivityに戻ると、Activityはすべての表示状態を回復するため、プロセスの終了はユーザー体験に顕著な影響を与えません.ステータスの保存と復元については、Activityドキュメントを参照してください.
  • 空のプロセス(Empty process)は、アクティブなアプリケーションコンポーネントを含まないプロセスです.このプロセスを保持する唯一の目的は、次にコンポーネントを実行するのに要する起動時間を短縮するためにキャッシュとして使用することです.プロセスキャッシュと最下位カーネルキャッシュのバランスを維持するために、システムはこれらのプロセスを終了することが多い.

  • プロセスの優先度について注意すべき内容:
  • プロセスの現在のアクティブコンポーネントの重要度に応じて、Androidはプロセスを最高レベルに評価します.たとえば、プロセスがサービスと可視Activityを管理している場合、このプロセスはサービスプロセスではなく可視プロセスとして評価されます.
  • さらに、1つのプロセスのレベルは、他のプロセスの依存性によって向上する可能性があります.すなわち、別のプロセスにサービスを提供するプロセスのレベルは、サービスを提供するプロセスよりも低くなりません.例えば、プロセスAのコンテンツプロバイダがプロセスBのクライアントにサービスを提供する場合、またはプロセスAのサービスがプロセスBのコンポーネントにバインドされている場合、プロセスAは常にプロセスBと同様に重要と見なされる.
  • サービスを実行するプロセスは、管理バックグラウンドActivityのプロセスよりもレベルが高いため、長時間実行操作を開始するActivityは、単純に作業スレッドを作成するのではなく、操作がActivityよりも永続的である可能性がある場合に特に、この操作のためにサービスを開始することが望ましい.たとえば、画像をWebサイトにアップロードしているActivityは、アップロードを実行するためにサービスを開始する必要があります.これにより、ユーザーがActivityを終了しても、バックグラウンドでアップロード操作を継続できます.サービスを使用すると、Activityがどのような状況であっても、この操作は少なくとも「サービスプロセス」の優先度を備えていることが保証されます.同様に、ブロードキャスト受信機も、単純にスレッドに時間のかかる操作を入れるのではなく、サービスを使用するべきである.

  • NEXT: http://www.jianshu.com/p/cd6510aa9150