2016-03-19 15 views
1

これが可能かどうかを知りたい。私の目的は、長い処理中にGC操作の数を減らすことです。Androidアプリケーションの空きメモリの初期量を増やす

私は無料で、最大ヒープサイズをご確認のAndroidアプリで

:それは言うonCreate()方法のため

LogCatで
Runtime runtime = Runtime.getRuntime(); 
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 

System.out.println("freeMemory: " + runtime.freeMemory()); 
System.out.println("maxMemory: " + runtime.maxMemory()); 
System.out.println("memoryClass: " + am.getMemoryClass()); 

freeMemory: 5678992 
maxMemory: 50331648 
memoryClass: 48 

その後、私はいくつかの長いStringを行います処理の途中で再びメモリをチェックします:

freeMemory: 1833176 

(実際のステージのために、私はJavaコードの最適化を実行しないので、私は唯一のメモリで作業し、この処理のコードを投稿しないでください)。

GCを実行してメモリを解放します。空きメモリがある処理の終わりに

GC_CONCURRENT freed 4760K, 42% free 7653K/13123K, paused 12ms+13ms, total 43ms 
GC_CONCURRENT freed 2012K, 42% free 7688K/13123K, paused 12ms+2ms, total 31ms 
GC_CONCURRENT freed 1839K, 42% free 7662K/13123K, paused 12ms+12ms, total 40ms 

::これは、アプリケーションを遅く

freeMemory: 4605040 

ドキュメントとして書かれています:

  • Runtime.freeMemory()

    現在ヒープ上で使用可能なヒープを展開せずに使用可能なバイト数を返します。

  • Runtime.maxMemory()

    ヒープに拡大することができる最大バイト数を返します。

私はRuntime.maxMemory()OutOfMemoryErrorを防ぐためにオーバーフローしすべきではないメモリを示して理解しています。 Runtime.freeMemory()の量を超えると、空きメモリが増えるだけです。

私のコードでのGCの解放操作は、メモリ消費操作の後に残っている空きメモリの量が少ないために発生していました(そのときは:freeMemory: 1 833 176)。しかし、空きメモリの総量は拡張されず、同じ開始制限内に留まるだけで解放されました。

また、空きメモリの初期量もそれほど高くないと思います(onCreate()の方法でを示したため)。そして、最初に約10MBの空きがあった場合、GCは実行されないため、アプリケーションは処理を高速化します。


そこで質問です:されていますが、私は頻繁にGCコールと拡大メモリを防ぐために、空きメモリの初期量を増やすことができる方法は?

ありがとうございました。ユーザーの立場から、あなたのMainifast.xmlで

+0

、それは(例えば、余分なコンストラクタの呼び出しを回避し、最初の場所でそれほど多くのゴミを発生させないことにより、GCを減らす方が良いでしょう、システムRAMを無駄にしない)。あなたは "長い処理"のコードを投稿していないので、それを手助けするのは難しいです。 – CommonsWare

+0

私はコードを最適化する必要があることを理解します。しかし、これは 'String'処理に関する別の質問です...ここでは、(この場合)GC呼び出しを減らすかどうかを知りたいのですが、最初の' 5MB 'のメモリ(作成されたオブジェクトの数を制限する)それを「10MB」に拡張することができます。 – mortalis

+0

あなたはGCが非常に正確ではないことを理解しています。 **ガベージコレクタへのコールはたくさんあります。操作によって多くのゴミが生成されているからです。利用可能なメモリ量は関係ありません.GCを減らすにはゴミを減らす必要があります。一方で、より多くのヒープを割り当てる必要はありません。この "ロングプロセッシング"中にHEAPメモリーを使い果たした場合、システムはより多くのHEAPを割り当て、その操作は100%透過的です。 – Budius

答えて

0

この属性を使用し

android:largeHeap="true" 
+0

ありがとうございます。しかし、私はすでに十分なヒープサイズを持っています: 'getMemoryClass()'は '48MB'を示します。しかし、GCを呼び出す前に、私は約5MBしか使用しませんでした。 – mortalis

関連する問題