Androidメモリの漏洩と最適化、MATツール


一.Androidマシンを紹介するには、メモリの使用問題がずっと重要で、注目されている問題です.コードの作成が適切でないか、論理が処理されていないと、マシンの動作が遅くなり、ハングアップすることもあります.プログラマーにとって、これは致命的なので、メモリの使用を理解し、メモリの漏洩を避け、メモリを最適化し続けます.メモリの漏洩による問題が発生した場合、logを分析し、ツールMATを使用することができます.
二.メモリ漏洩の原因となるメモリ漏洩は、メモリを占有するオブジェクトが使用して回収されていないことです.この現象では、javaプログラムがしばらく実行されると、消費されるメモリがますます大きくなり、Androidがプロセスに割り当てたメモリの使用上限に達すると、プログラムは死んでしまいます.
  • ListView、GridViewなどアダプタを使用する場合、ConvertViewキャッシュ
  • は使用されません.
  • Bitmap使用後
  • は解放されなかった
  • Contextが流出し、Contextの参照がライフサイクルを超えた.例えば、長時間走っている非同期タスクや長時間のオブジェクトがActivity(Contextタイプ)の参照を持っている場合、Activityは破棄されますが、メモリは依然として存在し、Contextは回収できません.この場合、getApplicationContextを使用した方がよい
  • データベースカーソルまたはファイルストリームキャッシュなどの使用後に
  • を閉じる.
  • スレッドの使用が不適切です.スレッド内のrun関数は時間のかかる作業を処理し、デバイスが縦横に画面を切り替えてActivityを再作成します.run関数が処理されていないため、参照されたActivityも破棄されません.さらにAsyncTaskは、動作メカニズムThreadPoolExcutorにより、ライフサイクルがさらに制御不能になり、問題が発生しやすくなります(具体的な解決方法は、以下の説明を参照).

  • 三.メモリ最適化の注意点
    1.画像の最適化AndroidにBitmap画像を表示すると、一定のメモリ消費をもたらし、OOM異常爆発を招くこともあるので、画像の表示については、一定の処理を行う必要があります.
  • の大きな画像は、圧縮してロードする必要があることを示しています.例えば150 kbの画像で、メモリを読むと、その画像の画素が2048*1024で、属性がARGB_8888(デフォルト)、つまり1ピクセル4 byteで、合計メモリは4*2048*1024 byteで、8 M以上です.大きな画像の圧縮ロードの必要性がわかります.具体的な圧縮の詳細方法は、Androidが効率的に大きな図をロードし、OOMを防止し、マルチグラフソリューション
  • を見ることができます.
  • マルチグラフ表示時にメモリキャッシュ技術を活用します.1つのListView(またはGridView)では、ピクチャをロードし続け、メモリにピクチャを常にメモリに割り当てることはできません.メモリには上限値があるので、他の操作にもメモリを割り当てる必要があります.したがって、表示領域では、画面を削除したメモリの一部を回収処理します.しかし、削除した部分が次の操作ですぐに使用される場合、削除されて回収されるとすぐに性能効率が低下するため、LRUCacheキャッシュ技術を使用することができる.具体的には以上の博文が見られる.
  • ListViewのクイックスライドロード画像は、使用体験に影響を及ぼさない場合は、スライド状態を判断してロード操作を行う.クイックスライドでは、スライド中にロードされたリソースは使用されないため、ユーザが表示するリソースのロードに影響を与えるため、クイックスライド(SCROLL_STATE_TOUCH_SCROLL)リストでは、ロードリソースを取得することはなくなり、静止(SCROLL_STATE_IDLE)やタッチスクリーン(SCROLL_STATE_TOUCH_SCROLL)ではロードされなくなり、スクロールリスナーOnScrollListenerを登録する必要があります.

  • 2.スレッド、非同期タスクの最適化スレッド、非同期タスクなどのライフサイクルの制御不能性のため、メモリ漏洩のもう一つのソースとなっている.普段、頻繁に使われているので、慎重に扱わなければなりません.
  • Activityの終了時に作成したスレッドを破棄する必要があります.そうでなければ、スレッドがその存在するActivityの参照を持っている場合、実際には終了したと思っていたActivityは、スレッドが完了していないため、参照された古いActivityは破棄されず、メモリリークが発生するため、Thread.interrupt()を使用してスレッドを中断することができますが、本当の意味での中断ではありません!具体的には、Threadの割り込み機構(interrupt)
  • が詳細に見られる.
  • AsyncTask非同期タスクのライフサイクル制御不可.常にActivityでAsyncTaskを内部クラスとして作成するのが好きなので、時間がかかりUiインタラクションの操作が便利ですが、メモリの漏洩が発生しやすいため、リスクが大きいことに注意してください.非同期タスク内部はThreadPoolExcutorを実装メカニズムとしており、このようなスレッドオブジェクトのライフサイクルは不確定です!!1.スレッドの内部クラスを静的内部クラスに変更する(試したことがなく、効果が分からない)2.スレッドの内部に弱いリファレンスを使用してContextリファレンスを保存する2つのソリューションがネット上で提供されています.すなわち、
  •      public abstract class WeakAsyncTask<Params, Progress, Result, WeakTarget> extends AsyncTask<Params, Progress, Result> {  
        protected WeakReference<WeakTarget> mTarget;  
    
        public WeakAsyncTask(WeakTarget target) {  
            mTarget = new WeakReference<WeakTarget>(target);  
        }  
    
        /** {@inheritDoc} */  
        @Override  
        protected final void onPreExecute() {  
            final WeakTarget target = mTarget.get();  
            if (target != null) {  
                this.onPreExecute(target);  
            }  
        }  
    
        /** {@inheritDoc} */  
        @Override  
        protected final Result doInBackground(Params... params) {  
            final WeakTarget target = mTarget.get();  
            if (target != null) {  
                return this.doInBackground(target, params);  
            } else {  
                return null;  
            }  
        }  
    
        /** {@inheritDoc} */  
        @Override  
        protected final void onPostExecute(Result result) {  
            final WeakTarget target = mTarget.get();  
            if (target != null) {  
                this.onPostExecute(target, result);  
            }  
        }  
    
        protected void onPreExecute(WeakTarget target) {  
            // No default action 
        }  
    
        protected abstract Result doInBackground(WeakTarget target, Params... params);  
    
        protected void onPostExecute(WeakTarget target, Result result) {  
            // No default action 
           }  
    }  
    

    メモリの最適化には、補完が必要な点が多く、努力が必要です.
    四.メモリ分析メモリの使用状況の分析にしても、メモリの漏洩を調べるにしても、以下の大神の文章をよく見ることをお勧めします.見た後、大きな収穫があると信じています.私はそうです.=
  • androidでメモリ漏洩を分析する方法
  • Androidベスト・パフォーマンス・プラクティス(2)-メモリの使用状況を分析する
  • 後で読むためにここに記録します.