web-dev-qa-db-ja.com

Androidでアプリケーションのヒープサイズを検出する

Androidアプリで使用可能なアプリケーションヒープサイズをプログラムでどのように検出しますか?

SDKの以降のバージョンでこれを行う関数があると聞きました。いずれにせよ、私は1.5以上で動作するソリューションを探しています。

142
hpique

公式の API は次のとおりです。

これは、より大きなメモリデバイスが登場した2.0で導入されました。以前のバージョンのOSを実行しているデバイスは、元のメモリクラスを使用していると想定できます(16)。

20
hackbod

Debug.getNativeHeapSize()がトリックを実行します。ただし、1.0から存在しています。

Debugクラスには、割り当てやその他のパフォーマンスの問題を追跡するための多くの優れたメソッドがあります。また、メモリ不足の状況を検出する必要がある場合は、Activity.onLowMemory()をチェックしてください。

13
Neil Traft

方法は次のとおりです。

アプリが使用できる最大ヒープサイズの取得:

Runtime runtime = Runtime.getRuntime();
long maxMemory=runtime.maxMemory();

アプリが現在使用しているヒープの量を取得する:

long usedMemory=runtime.totalMemory() - runtime.freeMemory();

アプリが使用できるヒープの量を取得する(使用可能なメモリ):

long availableMemory=maxMemory-usedMemory;

また、それぞれを適切にフォーマットするには、次を使用できます。

String formattedMemorySize=Formatter.formatShortFileSize(context,memorySize); 
13

これは、最大ヒープサイズをバイト単位で返します。

Runtime.getRuntime().maxMemory()

ActivityManager.getMemoryClass()を使用していましたが、CyanogenMod 7(他の場所ではテストしませんでした)でユーザーがヒープサイズを手動で設定すると、間違った値を返します。

4
fhucho

一部の操作は、Javaヒープスペースマネージャーよりも高速です。 遅延操作しばらくの間、メモリ領域を解放できます。このメソッドを使用して、ヒープサイズエラーをエスケープできます。

waitForGarbageCollector(new Runnable() {
  @Override
  public void run() {

    // Your operations.
  }
});

/**
 * Measure used memory and give garbage collector time to free up some
 * space.
 *
 * @param callback Callback operations to be done when memory is free.
 */
public static void waitForGarbageCollector(final Runnable callback) {

  Runtime runtime;
  long maxMemory;
  long usedMemory;
  double availableMemoryPercentage = 1.0;
  final double MIN_AVAILABLE_MEMORY_PERCENTAGE = 0.1;
  final int DELAY_TIME = 5 * 1000;

  runtime =
    Runtime.getRuntime();

  maxMemory =
    runtime.maxMemory();

  usedMemory =
    runtime.totalMemory() -
    runtime.freeMemory();

  availableMemoryPercentage =
    1 -
    (double) usedMemory /
    maxMemory;

  if (availableMemoryPercentage < MIN_AVAILABLE_MEMORY_PERCENTAGE) {

    try {
      Thread.sleep(DELAY_TIME);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    waitForGarbageCollector(
      callback);
  } else {

    // Memory resources are availavle, go to next operation:

    callback.run();
  }
}
2
Zon

Asus Nexus 7(2013)32Gig:getMemoryClass()= 192 maxMemory()= 201326592

Nexus 7でゲームのプロトタイプを作成するミスをして、妻の汎用4.04タブレット(memoryclass 48、maxmemory 50331648)ですぐにメモリ不足になることを発見しました

Memoryclassが低いと判断した場合、より少ないリソースをロードするようにプロジェクトを再構築する必要があります。
Javaに現在のヒープサイズを表示する方法はありますか? (デバッグ時にlogCatではっきりと見ることができますが、currentheap>(maxmemory/2)アンロード高品質ビットマップが低品質をロードする場合のように、コード内で適応する方法を確認したいです

1
Tkraindesigns
Runtime rt = Runtime.getRuntime();
rt.maxMemory()

値はb

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
am.getMemoryClass()

値はMB

0
qinqie

プログラム的にですか、それとも開発とデバッグ中ですか?後者の場合、EclipseのDDMSパースペクティブからその情報を見ることができます。エミュレーター(プラグインされている物理的な電話でさえ)が実行されている場合、左側のウィンドウにアクティブなプロセスがリストされます。これを選択でき、ヒープの割り当てを追跡するオプションがあります。

0
Steve Haley