2017-12-22 6 views
3

アプリのメモリが不足することがよくあります。私はメモリ使用量を減らすことに取り組んでいますが、私が実際に行った変更が実世界に影響を与えているかどうかを確認するために、ユーザーの平均使用メモリ量、利用可能なメモリ量などを記録したいと思います。アプリのメモリを減らそうとすると、どのような値を記録すればよいですか?

私はキャプチャすることができ、これらの値が見つかりました:

long totalMemory = Runtime.getRuntime().totalMemory(); 
long freeMemory = Runtime.getRuntime().freeMemory(); 
long maxMemory = Runtime.getRuntime().maxMemory(); 

をしかし、私はそれらが正しいものですかどうか分かりません。そのfreeMemoryは、私がOutOfMemoryErrorを取得する可能性があるかどうかを教えてくれますか?そうでない場合、どの値を記録すべきですか?

+3

あなたは何も記録しないでください。 ASプロファイラツールを使用してメモリ使用量とその場所を調べる必要があります –

+0

私はこれを使用してメモリ使用量を減らしていますが、私のアプリケーションはかなり複雑で、ビデオを再生したり、複数のWebビューなどを持っています。ユーザーと彼らがアプリケーションでやっていることは不可能ではないにしても非常に困難になります。 – casolorz

答えて

3

私がOutOfMemoryErrorを取得する可能性があるかどうかを教えてくれるフリーメモリ値ですか?

おそらくそうではありません。

OutOfMemoryError割り当てを作成しようとしたときに、緊急ガベージコレクションの実行後であっても、その要求を満たすのに十分な大きさの空きブロックがない場合に発生します。 Android 7.1以降では、ガベージコレクタの性質上、ヒープが断片化するために発生することがあります。 freeMemory()は、最大空きブロックのサイズではなく、すべての空きブロックの合計を示します。

したがって、取得しているOutOfMemoryErrorのクラッシュを確認する必要があります。通常、Androidでは、Bitmapの読み込みなど、大きな割り当てが行われます。それがクラッシュの原因であれば、freeMemory()はほとんど役に立たず、ログできるものは何もありません。

一方、かなり小さい割り当て(たとえば、128バイト以下)でクラッシュしている場合は、本当にヒープを使い果たしている可能性が高いです。この場合、ログにはfreeMemory()が役立つ場合があります。

+0

私が見たものは、通常、大きな割り当てです。私は、多くのメモリを使用する不必要なビットマップをいくつか見つけましたが、多くのメモリを使用する他の非画像関連のものもあります。断片化を助ける方法はありますか? – casolorz

+0

@casolorz: "断片化を助ける方法はありますか?" - あなたのプロセスを必要以上に長持ちさせないでください。これは、Android 4.4以降でヒープの最適化を行う唯一の方法です。 Android 5.0-7.1では、ARTガベージコレクタは小さなフリーブロックを結合して大きなブロックを作成しますが、アプリがバックグラウンドにあるときにのみ作成されます。あなたのアプリがフォアグラウンドになっていても、Android 8.0以降には "移動"ガベージコレクタがあります。ビットマップに関しては、 'BitmapFactory.Options'の' inBitmap'を使ってそれらをリサイクルしてください。そうすれば、メモリを再割り当てする必要はありません。 – CommonsWare

+0

@casolorz:実際のビットマップは大きければ大きいほどですが、ImageViewsなどの用途が小さい場合は、 'BitmapFactory.Options'で' inSampleSize'を使って読み込みの解像度を下げてください。 'BitmapFactory.Options'で' inPreferredConfig'を使い、 'RGB_565'を試してみてください。' Bitmap'が消費するメモリ量は、色深度を減らすことで半減します。 – CommonsWare

関連する問題