13

これでプロジェクトは終了しました。現在直面している主な問題は、アプリケーションのメモリリークです(「リーク」とは、アクティビティへの参照を保持しているため、GCがアクティビティを収集できないことを意味します)

私が見つけたメモリリークが発生するケースのいくつかは次のとおりです。

コンテキストリーク

これは、アクティビティコンテキストへの長期にわたる参照が原因で発生します。

私がここで見つけたそれの非常に良い例、

private static Drawable sBackground;

@Override
protected void onCreate(Bundle state) {
  super.onCreate(state);

  TextView label = new TextView(this);
  label.setText("Leaks are bad");

  if (sBackground == null) {
    sBackground = getDrawable(R.drawable.large_bitmap);
  }
  label.setBackgroundDrawable(sBackground);

  setContentView(label);
}

ここで問題となるprivate static Drawable sBackground;のは、静的DrawableがコンテキストとしてActivityを使用して作成されるため、その場合、Activityを参照するDrawableへの静的参照があり、それがリークがある理由です。その参照が存在する限り、アクティビティはメモリに保持され、すべてのビューがリークされます。

画面の向きの変更

注意を引く2番目のケースは、画面の向きが変わる場合です。画面の向きが変わると、システムはデフォルトで現在のアクティビティを破棄し、その状態を維持しながら新しいアクティビティを作成します。そうすることで、AndroidはリソースからアプリケーションのUIをリロードします。ここで、すべての回転でロードしたくない大きなビットマップを使用してアプリケーションを作成したと想像してください。

ロードするビットマップが大きくなる可能性があるため、これにより多くのメモリリークが発生します。

コンテキストアクティビティ

3番目のケースは、アクティビティコンテキストへの参照であることがわかりました。また、メモリリークが発生します。

このようなメモリリークの発生を回避する簡単な方法はないかと思います。または、これらのメモリリークをチェックしてアプリケーションから削除するツールがある可能性がある場合。

4

2 に答える 2

11

これは古い投稿ですが、最近、SquareはLeakCanaryというライブラリをリリースしました。これは、メモリリークを見つけるための最も洗練されたソリューションです

于 2015-08-20T17:23:50.103 に答える
10

traceviewやメモリアナライザなどのツールを使用して、メモリリークをチェックできます

http://developer.android.com/tools/help/traceview.html

http://kohlerm.blogspot.com/2009/04/analyzing-memory-usage-off-your-android.html

これが私が役に立ったと思ったいくつかの記事です

http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

http://vahidmlj.blogspot.com/2012/10/android-memory-leak-on-screen-rotation.html

于 2012-12-04T07:52:11.417 に答える