これが可能かどうかを知りたい。私の目的は、長い処理中にGC操作の数を減らすことです。Androidアプリケーションの空きメモリの初期量を増やす
私は無料で、最大ヒープサイズをご確認のAndroidアプリで:それは言うonCreate()
方法のため
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で
、それは(例えば、余分なコンストラクタの呼び出しを回避し、最初の場所でそれほど多くのゴミを発生させないことにより、GCを減らす方が良いでしょう、システムRAMを無駄にしない)。あなたは "長い処理"のコードを投稿していないので、それを手助けするのは難しいです。 – CommonsWare
私はコードを最適化する必要があることを理解します。しかし、これは 'String'処理に関する別の質問です...ここでは、(この場合)GC呼び出しを減らすかどうかを知りたいのですが、最初の' 5MB 'のメモリ(作成されたオブジェクトの数を制限する)それを「10MB」に拡張することができます。 – mortalis
あなたはGCが非常に正確ではないことを理解しています。 **ガベージコレクタへのコールはたくさんあります。操作によって多くのゴミが生成されているからです。利用可能なメモリ量は関係ありません.GCを減らすにはゴミを減らす必要があります。一方で、より多くのヒープを割り当てる必要はありません。この "ロングプロセッシング"中にHEAPメモリーを使い果たした場合、システムはより多くのHEAPを割り当て、その操作は100%透過的です。 – Budius