24

Androidアプリケーションでメモリリークが発生します。私はすでにMATを使用してメモリ使用量を分析しました。しかし、EclipseのDDMSパースペクティブから1つの質問があります。1バイト配列[byte []、boolean [])はどういう意味ですか?

ここに画像の説明を入力してください

これは私のアプリケーションに固有ですか?これは大きなメモリリークの問題であり、これは常にサイズが大きくなり、残りはランダムに増減することがわかります。私の推測では、GCはこのタイプをキャッチしません。この小さな情報で、なぜこれが起こるのか誰かが説明できますか?

4

3 に答える 3

10

1バイト配列は、1バイト配列として編成されたデータ構造の指定です。あなたの場合、そのサイズで、私はビットマップまたはドローブルに賭けます。

メモリリークの最も一般的な理由は、静的オブジェクトが適切に管理されておらず、以下への参照を保持していることです。

  • コンテクスト
  • ビュー(コンテキスト(および場合によってはビットマップ)への参照を保持します)
  • スレッド(GCによって簡単に収集されない)
  • ハンドラー(コンテキストへの参照を保持します)

それらのほとんどは、オブジェクトが不要になったときにオブジェクトをnullに設定することで解決できます。

よろしく。

于 2012-11-27T11:48:48.840 に答える
9

Abyteとabooleanはそれぞれ1バイトです。それらの配列がある場合は、「1バイト配列」があります。

ByteBufferたとえば、それらの1つを内部的に保持する必要があります。

合計614個あり、最小のものはbyte[24](またはboolean[24])、最大のものは3MBです。それらすべてを合わせて104MBを使用します。

それらが参照されなくなった場合、GCはそれらを取り除きます。

例えばあなたが置くとき

private static byte myArray[] = new byte[3 * 1024 * 1024];

クラスの1つで、null()に戻さないでくださいmyArray = null。別のオブジェクトがそれを参照しているため、このクラスをガベージコレクションすることはできません。オブジェクトはクラス自体になります(のようにString.class)。クラスがアンロードされることはないため、クラスオブジェクトをガベージコレクションすることはできません。(それらは、ClassLoaderそれ自体が別のオブジェクトによって参照/ロードされる可能性があるそれらによって参照され、ClassLoaderオブジェクトを作成してそれらなしでクラスを使用することはできません-それらはとどまる必要があり、それらのクラスへの参照を保持する必要があります)

static通常はそれほど単純ではありませんが、多くの場合、どこかから始まります。

MAT内で(GCを強制した後)、存続することを意図していないオブジェクトの参照チェーンを調べ、参照を保持している1つのオブジェクトを特定します。これをコードで設定するnullと、リークはなくなります。ここでより詳細に説明されています:

http://android-developers.blogspot.de/2011/03/memory-analysis-for-android.html

于 2012-11-27T12:00:05.967 に答える
3

私は今夜​​この問題に遭遇し、ほとんどすべてのコードをチェックしましたが、何も見つかりませんでした。

私がやったことは、intelijからアプリを起動し、ホームボタンを押してアプリをもう一度開くことでした。アプリのヒープが2倍になるたび。

最後に、ADBからアプリを起動し、ホームボタンを押してアプリを再度開くと、古いアクティビティが元に戻らず、新しいアクティビティが開始されることがわかりました。終了を押すと、それらすべてを循環し始めます。それは、それらが2つの異なる意図として扱われるようなものです。それで私android:launchMode="singleTop"はマニフェストにメインアクティビティを入れて、それは問題を解決しました。

これがこの問題の主な原因ではありませんが、これに遭遇した場合は、何よりも前にこれを確認してください。それは私にとって3、4時間を無駄にしました。

于 2014-02-19T02:13:49.523 に答える