1

チェックでうまくいくと思いRuntime.getRuntime().freeMemory()ましたが、次のテストでは役に立たないことがわかりました。

List<Byte> listDebug = new ArrayList<Byte>();
Log.d("Free memory", String.format("%1$.2f", (float)Runtime.getRuntime().freeMemory()/(1024*1024)));
for (int i = 0; i < 100; i++) {
    try {
        listDebug.addAll(Arrays.asList(new Byte[1024 * 100]));
        Log.d("Free memory", i + ":" + String.format("%1$.2f", (float)Runtime.getRuntime().freeMemory()/(1024*1024)));
    } catch (Exception ex) {
        Log.d("Free memory", ex.getMessage());
    }
    catch (Error e)
    {
        Log.d("Free memory", e.getMessage());
    }
}

出力は次のとおりです。

03-09 03:16:11.267: D/Free memory(3860): 1.30
03-09 03:16:11.277: D/Free memory(3860): 0:1.25
03-09 03:16:11.287: D/Free memory(3860): 1:2.63
03-09 03:16:11.298: D/Free memory(3860): 2:3.86
03-09 03:16:11.298: D/Free memory(3860): 3:3.08
03-09 03:16:11.317: D/Free memory(3860): 4:4.85
03-09 03:16:11.317: D/Free memory(3860): 5:4.06
03-09 03:16:11.317: D/Free memory(3860): 6:3.28
03-09 03:16:11.367: D/Free memory(3860): 7:7.84
03-09 03:16:11.367: D/Free memory(3860): 8:7.06
03-09 03:16:11.367: D/Free memory(3860): 9:6.27
03-09 03:16:11.387: D/Free memory(3860): 10:7.84

リストを11回展開すると、テストアプリがクラッシュしfreeMemory()、最大数が返されます。私は深く戸惑っています。私のテストコードは根本的に欠陥freeMemory()がありますか、それとも完全に無関係java.lang.OutOfMemoryErrorですか?

4

1 に答える 1

2

短い答えは、それはやや無関係だということです。javadocは次のように述べています。

戻り値

空きメモリのおおよその量 (バイト単位)。

これをより詳細に扱う SO に関する他のいくつかの質問があります。

ある程度の誤差を許容して値を使用することもできますが (たとえば、85% のメモリ使用量を空きメモリがないものとして扱う)、おそらく最善の方法は、OutOfMemoryError発生したタイミングを単純にキャッチし、それに応じて動作を調整することです (より少ない値を使用してプロセスを再起動します)。メモリを集中的に使用するアプローチ、メモリから他のものをクリアして同じプロセスを再試行する、プロセスを完全にスキップする、ユーザーに警告する、あきらめるなど)。

于 2013-03-09T15:38:19.930 に答える