4

レイアウトに3ListViewつと 1 つをロードしました。EditText

をタッチするEditTextと、キーボードが開きます。その時点で、次のコードを使用してメモリ サイズを確認します。

Runtime rt = Runtime.getRuntime();
long vmAlloc =  rt.totalMemory() - rt.freeMemory();
long nativeAlloc = Debug.getNativeHeapAllocatedSize();

Log.d("Memory",className+"Maximum   : "+formatMemoeryText(rt.maxMemory()));

Log.d("Memory",className+"VM Heap   : "+formatMemoeryText(rt.totalMemory()));
Log.d("Memory",className+"NativHeap : "+formatMemoeryText(Debug.getNativeHeapSize()));

Log.d("Memory",className+"VM    (A) : "+formatMemoeryText(vmAlloc));
Log.d("Memory",className+"Nati(A)   : "+formatMemoeryText(nativeAlloc));

Log.d("Memory",className+"TotalAll  : "+formatMemoeryText(nativeAlloc+vmAlloc));
Log.d("Memory", "----------------------------------------------------");

キーボードが開くたびに、ネイティブ ヒープ サイズが増加します。最終的にアプリは強制終了します。

私はもう試した:

System.gc();
Runtime.getRuntime().gc();

ただし、約0.5〜1MBしか減少しません。次回キーボードを開くと、20〜30MB増加します。

アプリがネイティブ ヒープ メモリを閉じたりクリアしたりしないようにするにはどうすればよいですか?

4

2 に答える 2

3

キーボードがメモリ不足を引き起こしているためにアプリがクラッシュしているわけではありません。
入力フィールドに焦点を合わせてキーボードを要求するか、プログラムでメモリを割り当てますが、それほど大きくはありません。プログラムがクラッシュする可能性があります。コードを確認して、メモリ リークを見つけてください。

于 2013-07-23T04:30:21.400 に答える
0

Android キーボードを開いたときに、デバイスの向きが変更されていないことを確認してください。その場合、アクティビティ全体が再作成され、オブジェクトがアクティビティの参照を保持している場合、メモリリークが発生する可能性があるためです。

于 2013-10-02T05:36:35.183 に答える