Androidアプリで使用可能なアプリケーションヒープサイズをプログラムでどのように検出しますか?
SDKの以降のバージョンでこれを行う関数があると聞きました。いずれにせよ、私は1.5以上で動作するソリューションを探しています。
公式の API は次のとおりです。
これは、より大きなメモリデバイスが登場した2.0で導入されました。以前のバージョンのOSを実行しているデバイスは、元のメモリクラスを使用していると想定できます(16)。
Debug.getNativeHeapSize()
がトリックを実行します。ただし、1.0から存在しています。
Debug
クラスには、割り当てやその他のパフォーマンスの問題を追跡するための多くの優れたメソッドがあります。また、メモリ不足の状況を検出する必要がある場合は、Activity.onLowMemory()
をチェックしてください。
方法は次のとおりです。
アプリが使用できる最大ヒープサイズの取得:
Runtime runtime = Runtime.getRuntime();
long maxMemory=runtime.maxMemory();
アプリが現在使用しているヒープの量を取得する:
long usedMemory=runtime.totalMemory() - runtime.freeMemory();
アプリが使用できるヒープの量を取得する(使用可能なメモリ):
long availableMemory=maxMemory-usedMemory;
また、それぞれを適切にフォーマットするには、次を使用できます。
String formattedMemorySize=Formatter.formatShortFileSize(context,memorySize);
これは、最大ヒープサイズをバイト単位で返します。
Runtime.getRuntime().maxMemory()
ActivityManager.getMemoryClass()を使用していましたが、CyanogenMod 7(他の場所ではテストしませんでした)でユーザーがヒープサイズを手動で設定すると、間違った値を返します。
一部の操作は、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();
}
}
Asus Nexus 7(2013)32Gig:getMemoryClass()= 192 maxMemory()= 201326592
Nexus 7でゲームのプロトタイプを作成するミスをして、妻の汎用4.04タブレット(memoryclass 48、maxmemory 50331648)ですぐにメモリ不足になることを発見しました
Memoryclassが低いと判断した場合、より少ないリソースをロードするようにプロジェクトを再構築する必要があります。
Javaに現在のヒープサイズを表示する方法はありますか? (デバッグ時にlogCatではっきりと見ることができますが、currentheap>(maxmemory/2)アンロード高品質ビットマップが低品質をロードする場合のように、コード内で適応する方法を確認したいです
Runtime rt = Runtime.getRuntime();
rt.maxMemory()
値はb
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
am.getMemoryClass()
値はMB
プログラム的にですか、それとも開発とデバッグ中ですか?後者の場合、EclipseのDDMSパースペクティブからその情報を見ることができます。エミュレーター(プラグインされている物理的な電話でさえ)が実行されている場合、左側のウィンドウにアクティブなプロセスがリストされます。これを選択でき、ヒープの割り当てを追跡するオプションがあります。