[テン魏:PPS33Aの整合性管理] [] [] [さまざまな継続的に更新] [ランダムに選択された] [アンドロイド]各アプリケーションの割り当てメモリの品質とセキュリティで柔軟性の分布を、使用して、アプリケーションの始まりはしないギブ多くのメモリを割り当てますが、「十分に良い」メモリサイズを割り当てられた各プロセスには、この値の大きさを決めるために、各デバイスの実際の物理メモリサイズに基づいています。
操作および使用のアプリケーションでは、Androidのアプリケーションは、いくつかの追加のメモリサイズを割り当てます。しかし、サイズ分布は、システムは、各アプリケーションのためのメモリの無限の量を割り当てることができない、制限されています。
要するに、Androidのシステムは、ユーザがアプリケーションを再度開いたときにアプリケーションの起動時間を短縮することを保証するために、メモリ内のプロセスがより生きて作る最大限必要とし、ユーザーの利便性を向上させます。
Androidのメモリ管理についての話、Androidオペレーティングシステムのためのガベージコレクションのメカニズム:Androidシステムのメモリ管理メカニズムの詳細については、私は次の二つの記事を読むことをお勧めします。
避けメモリオーバーフロー
単にメモリから出しメモリのオーバーフローは(メモリのうちOOMをいう)、プログラムを指す実行され、アプリケーション・メモリは、システムメモリのオーバーフローが発生するので、それは不可能十分なメモリを適用すること、メモリを提供することができるよりも大きいです。
減少メモリフットプリントの対象
避けOOM最初のステップは、メモリサイズのうち、新たに割り当てられたオブジェクトを最小化することで、より軽量のオブジェクトを使用してみてください。
より軽量なデータ構造を使用して
例えば、我々はArrayMap / SparseArray HashMapのではなく、伝統的なデータ構造を使用して検討することができます。
それはレコードマッピング動作に対するオブジェクトの追加のインスタンスを必要とするので、通常のHashMapの実装は、より多くのメモリを消費します。さらに、彼らはAutoBoxのキーオートボクシングの値を回避し、梱包箱のソリューションを避けることで、より効率的SparseArray。
よりArrayMapの議論について/ SparseArrayは、以前のパフォーマンスの最適化を参照してください - パフォーマンス最適化されたコンテンツを計算します。
正しい使用は、列挙型
列挙型(列挙型)は、Java言語の機能です。しかし、公式のAndroidが強くあるため、コンパイル後の列挙型のどちらに内部クラスの多くを生成します列挙型にAndroidアプリケーションを使用しないことをお勧めし、モバイルデバイス上で、明らかに多くの貴重なメモリが占有されるメモリです。実装の詳細について列挙は、Javaのenumの原則の実装は、この記事を入力し確認することができます。
タイプを見つけることができる列挙原則の実装を理解するので、Androidのプログラムで列挙型を使用することは不可能ではありませんが、お勧めします。列挙型の使用の合理化は、シングルトンとして、いくつかの非常にエレガントな操作を行うことができます。
パブリック列挙EnumSingleton {
INSTANCE;
}
1
2
3
私たちは、逆コンパイルが見ることができるバイトコード:
パブリック最終クラスEnumSingletonは{列挙<EnumSingleton>を拡張します
public static final EnumSingleton INSTANCE;
パブリック静的EnumSingleton []の値();
パブリック静的EnumSingletonのvalueOf(文字列S)。
静的{}。
}
1
2
3
4
5
6
逆コンパイルしたコードから、インスタンスが*)(* <clinit> staticとして宣言、クラスローディングプロセス、仮想保証されている方法正しく同期、マルチスレッド環境でクラスをロックされています。スレッドセーフでインスタンス化するときしたがって、列挙が達成されます。
直列化および列挙型のデシリアライズは、Javaは特別な規定を作ったように、Java仮想マシンの仕様要件は、非常にJVMに定義された列挙各列挙型は、ユニークです。
java.lang.Enum valueOfメソッドの列挙を通じてオブジェクトを探すために、名前に基づいてされたときに、name属性は、出力結果に列挙オブジェクトでのみのJavaのシリアライズでは、直列化復元。一方、コンパイラは、このようにwriteObject、readObjectメソッド、readObjectNoData、にwriteReplaceはreadResolveおよび他の方法を無効にすることを、この直列化機構のカスタマイズを許可していません。
デシリアライズプレーンなJavaクラスは、デフォルトコンストラクタクラスの反射を呼び出すことにより、オブジェクトを初期化することになります。したがって、単一の実施形態のコンストラクタがプライベートであっても、それを破壊するために反射されます。再新しい直列化復元後のオブジェクト出て以来、ので、この単一の実施形態では破壊されました。
しかし、直列化復元の列挙は反射することによって実現されていません。そのため、抗シリアライズによって引き起こされる問題への損傷の単一の場合は発生しません。
興味は、Javaでのシングルトンパターンを実装するための効率的な方法は何StackOverflowの上で答えを見ることができますか?
Bitmapオブジェクトは、メモリフットプリントを削減することです
ビットマップは、大きな脂肪のメモリ、ビットマップの詳細のサイズについてのメモリフットプリントを消費することは非常に簡単で、Androidのピットファイルを参照してください。あなたのメモリのビットマップ正確にどのくらいですか?、ビットマップから作成は、メモリフットプリントが非常に重要である低減され、一般的には、以下の2つの指標があります。
スケーリング
メモリへの絵の前に、我々は不必要な荷重に大きな画像を避けるために、適切なスケーリングを計算する必要があります。
デコーディングフォーマット
選択ALPHA_8 / ARGB_4444 / ARGB_8888 / RBG_565、大きな違いがあります。
モード説明はバイトを占有しました
図1Bは、8ビットで構成ALPHA_8Alpha
ARGB_44444は4ビット16は、4つの色要素局2Bのそれぞれからなります
ARGB_88884 8は、色成分ステーション8(デフォルト)4B当たり32ビットで構成されています
5 RGB_565R、Gが6であり、Bは、5つの16ビットの合計ないα2bであります
小さい画像
絵に与えられたリソースの設計では、我々はあなたが小さい画像を使用できるかどうか、スペースを圧縮することができ、この画像の存在に特別な注意を払う必要があります。
メモリ使用量を減らすことができるだけでなく、小さな画像を使用してみてください、だけでなく、InflationExceptionの多数は避けます。メモリ不足のため、あなたは素晴らしい絵がXMLファイルを直接参照されているとし、最も可能性の高い意志InflationExceptionビューの初期化、問題の根本的な原因は、実際にOOMが起きた場合に発生します。
JPG、PNG、WEBP
これら三つの提言は、違いは何ですか画像フォーマットJPGやPNGの外観を理解していませんか?、現状維持の原則をサポートし、Androidのは、これら二つの記事をご紹介しWEBP。
画像圧縮
画像圧縮は、二つの記事は、画像圧縮分析におけるAndroidの(次の)、画像圧縮分析(上)でfacie知識テンセントAndroidの音楽技術チームを推奨します。
ルバニ:知識を関連する画像の圧縮を理解し、我々はあなたには、また、優れたオープンソースのライブラリを使用することができ、画像圧縮を実現するために、独自のアルゴリズムを書くことができます。
メモリオブジェクトの繰り返し使用
メモリはオブジェクトによって占有削減に加えて、合理的な再利用メモリオブジェクトは、メモリのオーバーフローを避けるための良い方法です。
再利用のほとんどのオブジェクトは、プログラムの最終的な実装では、コードオブジェクトプーリングの調製において明示作成し、実装ロジックの再利用に対処するためのいずれかのプログラム内のオブジェクトプール技術の使用、であるか、またはシステムのフレームワークを使用していますいくつかの再利用は、それによって、メモリの割り当てと回復を減らし、作成した繰り返しの削減の目的を達成するためのプロパティを既存の。
LruCache
内のデータのうち優先順位リスト上のキャッシュ容量は最低使用時に最も一般的に使用されるAndroidのキャッシングアルゴリズムはLRU(最近最も使用)で、超えています。
LruCache bitmapCache =新しいLruCache <文字列、ビットマップ>();
//メモリ空間に基づいてキャッシュサイズを設定します
ActivityManager午前=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE)。
int型availMemInBytes = am.getMemoryClass()* 1024 * 1024;
LruCache bitmapCache =新しいLruCache <文字列、ビットマップ>(availMemInBytes / 8)。
1
2
3
4
5
使用LruCacheは、Bitmapオブジェクトをキャッシュすることができ、ちょうど同じLruCacheメモリオブジェクトは、我々は画像、動画などの大きなファイルをしたい場合は、キャッシュがディスク上にJakeWharton神オープンソースDiskLruCacheを使用することができ、有効です。
使用グライド
グライドは、スムーズなスクロールに焦点を当て、高速かつ効率的なAndroidの画像読み込みライブラリです。グライドは、ユーザーフレンドリーなAPI、高性能、スケーラブル映像復号化パイプライン(デコード・パイプライン)、ならびに自動リソースプールを提供します。
グライドも参照、Googleのオープンソースプロジェクトを推奨:グライド。
システムを多重化すると、リソースが付属しています
Androidシステム自体は多くの資源構築されている(例:スタイル、シンプルなレイアウトなどに、文字列、色、画像、動画)を、これらのリソースをアプリケーションで直接参照することができます。
だけでなく、そうすることで、その負荷アプリケーションを減らすあなたのAPKのサイズを小さくする、あなたはまた、ある程度のメモリのオーバーヘッドを減らすことができ、より良い再利用することができます。それは、Androidシステムのバージョンの違いに注意を払う必要がある。しかし、システム性能のものと異なるバージョンの間には大きな差がある状況では、アプリケーション自体に組み込ま要件、または必要性を満たしていません。
多重ConvertView
サブアセンブリConvertView多重の複製ビューの数は、リストビュー、などのGridViewの表示されます。
onLowMemory()
OnLowMemoryはAPI Androidは、システム内のメモリのうちの、すべてのバックグラウンドプログラムが(優先プロセスの背景ではなく、バックグラウンドで実行中のプロセスに)殺害されている提供され、システムがOnLowMemory呼び出します。
アプリケーション、活動、Fragementice、サービス、のContentProvider:コールバックシステムです提供します。
onTrimMemory()
OnTrimMemory APIをコールバックの状態にシステムメモリに依存し、アンドロイド4.0後に提供されます。
アプリケーション、活動、Fragementice、サービス、のContentProvider:コールバックシステムです提供します。
OnTrimMemoryパラメータは、int値は異なるメモリ状態を表します。
アプリがフォアグラウンドで実行している場合、(低から高へ)機能のレベルは以下のとおりです。
TRIM_MEMORY_RUNNING_MODERATE
システムは、アプリケーションがメモリ不足の状態で実行されている実行を開始、それが殺されることはありません。
TRIM_MEMORY_RUNNING_LOW
システムをより低メモリ状態で実行されている、アプリケーションの実行中、殺されることはありませんアプリケーションは、円滑なシステムを確保するために、いくつかのリソースをクリーンアップすることができます。
TRIM_MEMORY_RUNNING_CRITICAL
システムは、アプリケーションが実行されている、比較的低いメモリ状態で実行され、システムが、私たちは、このアプリを殺すことができるとは思いませんが、システムはバックグラウンドプロセスを殺すために始めました。この時点で、アプリケーションはいくつかの重要なリソースを解放するために行く必要があります。
アプリケーションがバックグラウンドで実行されている場合、レベルのステータスは以下のとおりです。
TRIM_MEMORY_UI_HIDDEN:
アプリが見えUIはありませんが、アプリケーションはより大きなリソースの使用UIをきれいにすることができます。
アプリケーションがバックグラウンドLRUリストに入るとき:
TRIM_MEMORY_BACKGROUND
低メモリで実行しているシステムでは、アプリケーションプロセスが殺されないリスクにもかかわらず、LRUリスト、アプリケーションの近く始まるが、持っている可能性のあるシステムは、バックグラウンドプロセスを殺すことです。アプリは回復するいくつかのリソースをクリーンアップするのは簡単でなければなりません。
TRIM_MEMORY_MODERATE
低メモリで実行しているシステムは、LRUリストの途中でアプリの取り付けプロセスは、この時点でアプリケーションが強制終了された可能性があります。
TRIM_MEMORY_COMPLETE
低メモリで実行しているシステムでは、アプリケーションのいずれかが最初の選択肢で、アプリケーションのAppは、速やか前に状態を復元するためにクリーンアップする必要があります殺され、すべてのリソースは重要でありません。
また、より多くのアプリケーションがメモリを占有し、システムがバックグラウンドLRUリストをクリーンアップし、より多くの可能性が高い優先順位をクリーンアップすることです。そこで、我々は、使用メモリ使用量に注意する必要があります。
onDraw実行メソッド内でオブジェクトを作成しないようにしてください
彼はメモリの使用の急速な増加となり、簡単に頻繁にGCにつながることができ、あるいはメモリを振るので、頻繁に呼び出さOnDraw同様の方法は、オブジェクトを作成するために、ここで操作を行う必要性を避けるようにしなければなりません。
連載
Androidのは、一般的にし、SerializableをParcelable二つの方法で直列化を実装しました。
I / Oを使用して、異なる記憶媒体、シリアライズ中の2つの嘘の間の最大の差は、読み取りおよび書き込みは、ハードディスク上に格納され、メモリに直接Parcelable読み出されます。明らかに、書き込み速度は、データは、Androidの嗜好Parcelableで送信され、IOメモリを読み取るより典型的には大きいです。
操作は、反射である必要はなく、データははるかに高速メモリネイティブ効率に保存されている(整列化&アンマーシャリング)直列化は、リフレクションを使用するシリアル化および逆シリアル化プロセスがI / O操作の多くを必要とし、Parcelable自身のマーシャリングを達成し、ブロック解除します。
良好シリアライズよりParcelable性能は、メモリのオーバーヘッドの点で小さな、メモリ間のデータ転送時に(そのような活性との間のデータ伝送など)Parcelableを使用することが推奨されます。
直列化データの永続性を簡単にAndroidのParcelableの異なるバージョンが異なる場合がありますので、保存したり、送信データにシリアライズネットワークを選択する必要があるので、それは、データの永続性のためにParcelableをお勧めしません、保存することができます。
StringBuilder
いくつかのケースでは、コードは、一緒に文字列の多数を動作させるために必要とされる、その代わりに、頻繁のStringBuilder +の今回の使用を考慮する必要があります。
避けメモリリーク
彼はメモリリークを作成するように、メモリリーク(メモリリーク)プログラムは、一時的な変数を割り当てるためにメモリ内で実行されている疲れた後が、GCが回収できない、常にメモリを占有していない、どちらも使用することができていることは、他のプログラムに割り当てることができません。
開発者は、メモリリークがあると知っているが、時にはあなたは非常に深刻な、とさえプロンプトOOMないようにメモリは、検出するために、時には深刻で、困難漏れます。
コンテキストリーク
Androidの開発では、メモリリークの問題は、コンテキストにつながる可能性が最も高いです。たとえば、コンテキストの活動は、メモリ参照を多量に含んで、漏れたコンテキストたら、それはまた、すべてが漏洩ポイントをオブジェクトのことを意味します。
一般的な原因によって引き起こされる活動リーク:
静的参照アクティビティ
クラスで定義されたアクティビティの静的変数、現在静的変数に割り当てられたインスタンスを実行しているアクティビティ。静的変数は、アクティビティのライフサイクルの終わりに空でない場合は、メモリリークが発生します。
アプリケーションのライフサイクル全体での静的変数は、それがリークされた活動は、常にアプリケーション・プロセスに存在していますのでゴミは収集されません。
静的な活動活動; //このコードは避けるべきです
1
単一の実施形態のアクティビティに保存されています
シングルモードの実施形態では、活性がしばしば使用される場合、メモリアクティビティの例に格納されているが、非常に有用です。
しかし、アプリケーションのライフサイクルの単一例のライフサイクルのために、それは非常に危険で不要な、活動のライフサイクルの延長を強制し、どのような場合には、省は、単一の場合には同様の活性をオブジェクトことはできません。
パブリッククラスシングルトン{
プライベート静的シングルトンインスタンス。
プライベートコンテキストmContext。
プライベートシングルトン(コンテキスト・コンテキスト){
this.mContext =コンテキスト。
}
パブリック静的シングルトンのgetInstance(コンテキスト・コンテキスト){
IF(例えば== NULL){
同期(Singleton.class){
IF(例えば== NULL){
インスタンス=新しいシングルトン(コンテキスト)。
}
}
}
インスタンスを返します。
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
着信シングルトンのgetInstance()メソッドにおける活性。インスタンスが解放されていないときに、活動は常に存在するので、メモリリークが発生します。
代わりに、アクティビティーコンテキストのアプリケーション・コンテキストを使用することを検討してください
アクティビティーコンテキスト(文脈のダイアログがアクティビティーコンテキストでなければなりません)のほとんどの非本質的な使用のために、我々は代わりにコンテキスト活動のアプリケーションコンテキスト、不用意に漏洩した活動回避の使用を検討することができます。
内部クラス
利点インナークラスは可読性およびカプセル化を向上させることができ、クラス外部からアクセスすることができ、残念ながら、メモリリーク理由リードは内部クラスが強い参照のクラスインスタンスの外側を保持することである(例えば、オブジェクトのクラス内の活動を保持しています)。
ソリューション:
内部クラスは、静的な内部クラスになります。
財産の強い参照活動、弱参照のプロパティ参照がある場合。
許可事業の場合は、とき活動の実行onDestory、これらの時間のかかるタスクの終了。
非同期コールバックを使用しないでください
不確実性を実行するための時間非同期コールバックの可能性が高い活動が破壊された後に発生することがあるだけでなく、簡単にクラッシュにつながる、それはまだメモリリークを起こしやすいです。
一時的なビットマップオブジェクトタイムリーな回復に注意してください。
ほとんどの場合、我々はビットマップキャッシュメカニズムを高めるが、いくつかの点であろうが、ビットマップの一部は、タイムリーな回復のために必要です。
たとえば、次のように比較的大きな一時的なビットマップオブジェクトが作成され、後の新しいBitmapオブジェクトを変換し、できるだけ早く元のビットマップを回復する必要があり、これはスペースが速く、元のビットマップによって占有解放することができます。
特別な注意を必要とすると、この機能は、ビットマップ可能とソースビットマップが同じであるcreateBitmap()メソッドを提供Bitmapクラスを返すされ、回復の時に、私たちは特別な検査、参照元ビットマップとリターンマップのみがなくて、同じである必要がこのような状況の下で、元のビットマップのリサイクル方法を実行できるようにします。
リスナーがログアウトすることに注意してください
そこに登録するには多くのニーズがあるとAndroidアプリケーション内でリスナー登録解除、我々はこれらのリスナー登録解除タイムリーに適切なタイミングでそれを確認する必要があります。リスナーを手動で追加するには、このリスナーを削除するには覚えておく必要があります。
オブジェクトは、カーソルをクローズするかどうか注意
プロセスでは、我々は多くの場合、データベースのクエリ動作しますが、カーソルの不注意な使用が閉じなかった後にケースがしばしばあります。これらのリークカーソル、メモリ管理の繰り返し発生し、巨大な負の影響を与えるだろう、我々はCursorオブジェクトをクローズするために覚えておく必要があります。
なお、オブジェクトキャッシュコンテナリーク
時には、オブジェクトの再利用性を向上させるために、キャッシュ容器にいくつかのオブジェクトを置くが、これらのオブジェクトは、速やかにコンテナから削除されていない場合、また、メモリリークにつながる可能性があります。
たとえば、次のようにシステム2.3、もし強力な描画可能とViewアプリケーションは、活動が簡単に漏洩につながる可能性があるため、キャッシュコンテナに追加描画可能。4.0からは、この問題は存在しません。この問題を解決するために、我々は、漏れを避けるために、問題のアンバンドリングの参照を処理し、2.3システム上で特別なパッケージキャッシュ描画可能を確認する必要があります。
なお、WebViewのリーク
AndroidのWebViewの偉大な互換性の問題の存在下で、AndroidシステムのWebViewに大きな違い、WebViewの内部のROMを出荷し、別の異なるベンダーのちょうど別のバージョンにも大きな違いがあります。親アクティビティをリーク - より深刻なメモリは標準のWebViewの問題をリークしている、ここを参照してくださいWebViewのは、メモリリークが発生します。
それは、通常、この問題はWebViewのための別のプロセスを開くことです治すあるメインプロセスとAIDLを介して通信するのWebView必要性が完全な解放メモリを達成するように、業務に応じた適切な時期を選択する場合は、プロセスが破壊される可能性があります。
リントツール
リントは、Androidのメーカーが提供するコード分析ツールをスキャンしている、それはいくつかのソリューションを提供しながら、私たちは、コードの構造/品質問題を見つけるのを助けることができる、そしてこのプロセスは、テストを手書き私たちを必要としません。
リントそれぞれの問題が説明と評価(テストと非常によく似たバグを発見した)発見した、我々は簡単に、同時に重要度に従って解決することが、問題を見つけることができます。
> [分析]をクリックしますリント・ツールを開くために、コードを点検します。
リント
詳細についてはAndroidの開発ドキュメントを表示することができます - 利用リントはあなたのコード、Androidのパフォーマンスの最適化を向上させる:、リント最適化されたコードを使用して余分なリソースを削除、これらの二つの記事、比較的単純なの使用は、リソースのオンライン導入の多くは、もはや詳細にそこに記載されていません。