21

ListViewアクティビティが終了すると、メモリからクリアされると思います。ただし、漏れているようです。メモリ ダンプを確認して取得するpathToGCListView、次のようになります。

Class Name                                                          | Shallow Heap | Retained Heap 
android.widget.ExpandableListView @ 0x4063e560                      |          768 |        39,904 
|- list, mList com.hitpost.TeamChooser @ 0x405f92e8                 |          176 |         1,648 
|  '- mOuterContext android.app.ContextImpl @ 0x40657368            |          160 |           304 
|     '- mContext android.media.AudioManager @ 0x40662600           |           40 |           168 
|        '- this$0 android.media.AudioManager$1 @ 0x406626b0 Unknown|           24 |            24 

これと同じコンテキストが多くのListView's. トリックは、私はAudioManager自分のアプリのどこにもまったく使用しておらず、アプリからの音もまったく出ていないということです。助けてください、それは私を夢中にさせています。なぜこれが起こっているのか、根本的な問題は何かを明らかにしようとしていますか?

4

8 に答える 8

5

AudioManagerコードには、積極的に作成しないへの参照がいくつかあります。たとえば、クリッカブルごとViewに onClick サウンドを再生するものがあります [ source ]。それがリンクだと思います。

AudioManager設定でクリック音を無効にすると、コードはへの参照を作成しないようです。あなたはそれを試して、まだ漏れがあるかどうかを確認することができます.

リークの理由はView、ListView (Adapter?) コードで何らかのオブジェクトを保持している可能性があります。それらを保持している場合、参照Viewがあり、AudioManager 参照を保持している可能性がありContextます)

于 2012-03-18T11:21:36.340 に答える
4

私はこれと同じ問題を抱えていましたが、以下のアドバイスに従うと消えました。

Guy 氏は、デバッガーでヒープ ダンプを実行せず、ダンプを取得する前にいくつかの GC を発生させることを推奨しています。 https://groups.google.com/forum/?fromgroups=#!topic/android-developers/ew6lfZUH0z8

于 2012-12-21T19:21:52.763 に答える
0

同じ問題に関する私の経験を共有したいと思います。デフォルトで一部のアクティビティをスタックに保持し、それらを終了していませんでした。

これらのアクティビティについては、上記の hprof レポートと同じ結果が得られました。

アクティビティを使用しなくなったら、上記の参照は表示されませんでした。アクティビティが不要になったら終了するだけで、この問題は解決されます。

于 2014-01-21T04:42:55.767 に答える
0

これは、問題を再現する非常に基本的なアクティビティです (少なくとも Android 4.0.3 では)。

public class MainActivity extends Activity {

    int image[];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.activity_main);
        image = new int[1000 * 1500 * 4];
    }
}

ご覧のとおり、アクティビティに関連付けられたビューやレイアウトはありません。また、システムのサウンド設定で「サイレント」プロファイルを設定し、「タッチ時に振動」をオフにしました。

現在、数回 (heapSize に応じて 5 ~ 7 回) 再起動した後、このアクティビティは、新しい配列を作成しようとすると java.lang.OutOfMemoryError を生成します。

07-27 19:54:10.160  22542-22542/? D/dalvikvm﹕ GC_FOR_ALLOC freed 6K, 1% free 56040K/56391K, paused 25ms
07-27 19:54:10.190  22542-22542/? D/dalvikvm﹕ GC_BEFORE_OOM freed 23449K, 43% free 32591K/56391K, paused 30ms
07-27 19:54:10.260  22542-22543/? D/dalvikvm﹕ GC_CONCURRENT freed 0K, 1% free 56029K/56391K, paused 3ms+3ms
07-27 19:54:11.850  22542-22542/? D/dalvikvm﹕ GC_FOR_ALLOC freed 6K, 1% free 56040K/56391K, paused 20ms
07-27 19:54:11.880  22542-22542/? D/dalvikvm﹕ GC_BEFORE_OOM freed <1K, 1% free 56040K/56391K, paused 29ms
... Out of memory on a 24000016-byte allocation.

.hprof のダンプ 2 つのアクティビティも確認しました。そのうちの 1 つは AudioManager によって保持されています。

Android Device Monitor で「Update Heap」を呼び出してから Collect Garbage を呼び出すと、実際にはメモリからアクティビティが削除されます。これは、この手順で logcat が述べていることです。

07-27 19:44:23.150        85-85/? I/DEBUG﹕ #06  pc 000382cc  /system/lib/libdvm.so (dvmCollectGarbageInternal(GcSpec const*)+1204)

また、apk のリリース バージョンをビルドしようとしましたが、同じように動作します。したがって、参照を保持しているデバッガーではありません。

これは Android のバグのように思えます。回避策は、アクティビティの OnStop() または onFinish() で image = null を明示的に呼び出すことです。もちろん、これは便利ではありません。

于 2015-07-27T12:22:03.577 に答える
0

私のアプリケーションで見つかった最も一般的な理由は、XML ファイルを介していくつかのコンポーネントを初期化することでした。これを行うと、Activity Contextが注入されますが、必要なのはApplicationContext. Android の Web ビューに関しては、この手法が大いに役立ちました。

于 2013-11-15T04:23:29.257 に答える
-4

アプリケーションがメモリリークのためにクラッシュした場合は、try --catch(java.lang.outofmemory)を使用してこのクラッシュを回避できます。実際、GCはJVM自体によって呼び出されるため、プログラマーはこれを制御できません。アプリケーションをSDカードにインストールできます。この場合、SDカードのメモリが使用されます。メモリリークは発生しません。

マニフェストファイルに移動するだけで、バージョン番号が必要です。バージョン名には、「インストール場所」も必要です。「preferExternal」にします。

于 2012-03-13T06:45:38.740 に答える