メモリのスラッシング
メモリジッターは、発生期の領域に短期間に多数のオブジェクトが出入りする ことによって引き起こされます. メモリは、短期間で急速に上昇および下降する傾向を持ち、高いものから低いものへと変動し、分析グラフギザギザです。
これには頻繁な GC が伴い、大量の UI スレッドと CPU リソースが占有され、アプリ全体がフリーズします (GC がメモリの再利用時に作業スレッドを停止するため)、OOM の可能性さえあります (理由:新しい世代で多数のオブジェクトを作成し、新しい世代に割り当てられたスペースは比較的小さいため、古い世代のスペースの一部を占有します.
メモリーリーク
プログラム内で動的に割り当てられたヒープメモリが解放されていないか、何らかの理由でプログラムが解放できず、システムメモリが無駄に消費されます。
オブジェクトの生存判定 --- 到達可能性解析
オブジェクトがroot-reachableの場合は収集されず、root-unreachableの場合は収集されます。 メモリ リークは、オブジェクトがルートの到達可能性を満たしているが、利用できないことです。
メモリ リークの典型的なケース: 静的変数はアクティビティを参照し、この静的変数はグローバルです。APP プロセスが強制終了されない限り、この静的変数は常に存在します。また、Activity はライフサイクル onDestory() を実行しましたが、Activity は static 変数によって適用され、ルートに到達可能であり、Activity にメモリ リークが発生しています。
メモリ分析ツール
1. Android プロファイラー
Memory Profiler はAndroid Profilerのコンポーネントで、アプリのフリーズやクラッシュの原因となるメモリ リークやメモリ スラッシングを特定するのに役立ちます。アプリケーションのメモリ使用量のリアルタイム グラフが表示されるため、次のことが可能になります。
キャプチャ ヒープ ダンプ
ガベージ コレクションを強制する
メモリ割り当てを追跡する
2.MAT(メモリーアナライザーツール)
メモリ スナップショットの比較では、より効率的にメモリ リークの対象を見つけるために、通常 2 つのヒープ ダンプファイルが取得されます(最初に 1 つをダンプし、しばらくしてからもう 1 つをダンプします)。
最適化ケース
文字列の継ぎ合わせは毎回新しい文字列オブジェクトを作成してしまうので、できる限りStringBuilderを使って完成させてください.StringBuilderは内部で文字配列を操作して完成させます.