web-dev-qa-db-ja.com

メモリプロファイラの「コード」セクションと「ネイティブ」セクションがメモリを使いすぎるのはなぜですか。どうすればそれを減らすことができますか?

私のアプリは、ユーザーが初めて開いたときに75MBのメモリを使用します。

Androidプロファイラーツールfrom Android Studioを使用して、Androidアプリのメモリ使用量を調べました。メイン画面が開いたらメインアクティビティで大量のメモリを必要とするオブジェクトが作成されない場合でも、アプリは75MBのメモリの使用を開始します。ビットマップや大きな配列などはありません。

40MBは「コード」セクションからのものであり、19MBは「ネイティブ」からのものであり、このアクティビティではネイティブライブラリをロードしません。ただし、ユーザーが別のアクティビティを開いた後にロードします。メモリ使用量を削減しようとしていますが、「コード」セクションと「ネイティブ」セクションからどのように削減できるのでしょうか。

Androidプロファイラーからのスクリーンショット

enter image description here

8
cezmi sakar

nativeメモリ使用量について:

  1. Androidフレームワークは、アプリにネイティブコードがない場合でも、ネイティブメモリを利用できます。「ネイティブ」 ここ を参照してください。たとえば、サンプルプロジェクトを作成しようとしました。1つのActivityと1つのButtonがあり、ネイティブメモリの使用量は18 MBですが、ガベージコレクションをトリガーすると8MBになります。 Android Studioでガベージコレクションを手動でトリガーするには、メモリプロファイラーウィンドウの左上にある[ゴミ箱]アイコンをクリックします。そのボタンを恥ずかしがらずに、通常、メモリ使用量が減少するのを確認するには、連続して何度も押す必要があります。

  2. ネイティブメモリは、ByteBuffer.allocateDirect(int)を使用してネイティブライブラリをロードすることなく、Javaから割り当てることもできます。

  3. 次のActivityまでネイティブライブラリをロードしないと言った場合、ライブラリを静的に(_static { }_内で)ロードすると、ライブラリが実際にロードされる保証はありません。 2番目のアクティビティが開始されます。以前にロードされる可能性は非常に高いです。ライブラリが実際にいつロードされるかを確認したい場合は、このメソッドをCコードに追加してみてください。ライブラリがロードされたときに呼び出す必要があります。それはとても汚いです、しかし、ねえ、それは働きます。クラッシュする代わりに何かをログに記録するかもしれません。

__attribute__((constructor)) void init(void) { int a = *(int *) ((void *) 0); }

codeのメモリ使用量については、コードを減らす必要があります:)

まだ行っていない場合は、デバッグビルドでメモリ使用量を検査していると仮定して、ビルドタイプでminifyEnabledtrueに設定します。

_    ...
    buildTypes {
        debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    ...
_

また、インスタント実行をオフにします(「注」を参照 ここ )。

11
lelloman