質問

いプログラムの検出用のヒープサイズをAndroidアプリ?

聞いている機能は今後のバージョンのapiを提供します。場合にはうってつけのソリューションすることができます1.5上向きになるようにします。

役に立ちましたか?

解決

には二つの方法が用意されていを考えるフレーズ"用のヒープサイズ":

  1. どのくらいのヒープが私のアプリの使用前にハードエラーが発?や

  2. どのくらいのヒープ すべ 私のアプリの利用の制約のAndroid OSのバージョン、ハードウェアのクライアントユーザーのデバイス?

が異なる方法を決定するのです。

1.上記の maxMemory()

できるメソッドが呼び出され(例えば、自主活動の onCreate() 方法として

Runtime rt = Runtime.getRuntime();
long maxMemory = rt.maxMemory();
Log.v("onCreate", "maxMemory:" + Long.toString(maxMemory));

この方法を教えてくれる方を多くの合計 バイト ヒープのアプリ を利用します。

商品2: getMemoryClass()

できるメソッドが呼び出されて

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
int memoryClass = am.getMemoryClass();
Log.v("onCreate", "memoryClass:" + Integer.toString(memoryClass));

この方法を教えてくれる方が多く メガバイト ヒープのアプリ すべ 使い適切に尊重さの制限は現在のデバイスの権利を他のアプリ実行されずに繰り返し強制的に onStop() / onResume() サイクルしてrudelyが流出しやすくなっているためのメモリがエレファンティネアプリは、Androidジャグジー付です。

この区別は明確に文書化し、これまでのところは分かっていないとしてこの仮説に異なるAndroidデバイス(下記参照して確認で自分の満足することは正しい。

株Androidのバージョン, maxMemory() は、通常、返同じ数メガバイトとして表示 getMemoryClass() (約万回後者の値)となります。

の状況を認識している二つの方法で分岐が根付いたデバイスの走行にはAndroidなどのCyanogenModおり、ユーザーを手動で 選択 大ヒープサイズを可能にすることは各アプリです。CMは、例えば、このオプションが下"CyanogenMod設定"/"性能"/"VMヒープサイズ")

注意:この設定でこの値を手動できるべての空港を表示一部の空港を表システム、特にを選択した場合より小さい値にはしています。

こちらは自試験の結果によって返される値の maxMemory()getMemoryClass() つの異なるデバイスの走行CyanogenMod、二つの異なる(手動でセット)ヒープ各:

  • G1:
    • とVMのヒープサイズに設定16MB:
      • maxMemory:16777216
      • getMemoryClass:16
    • とVMのヒープサイズに設定24MB:
      • maxMemory:25165824
      • getMemoryClass:16
  • Moto-ドロイド:
    • とVMのヒープサイズに設定24MB:
      • maxMemory:25165824
      • getMemoryClass:24
    • とVMのヒープサイズに設定16MB:
      • maxMemory:16777216
      • getMemoryClass:24
  • Nexus One:
    • とVMのヒープサイズに設定32MB:
      • maxMemory:33554432
      • getMemoryClass:32
    • とVMのヒープサイズに設定24MB:
      • maxMemory:25165824
      • getMemoryClass:32
  • Viewsonic GTab:
    • とVMのヒープサイズに設定32:
      • maxMemory:33554432
      • getMemoryClass:32
    • とVMのヒープサイズに設定64:
      • maxMemory:67108864
      • getMemoryClass:32

また、上記のほか、テNovo7パラディンタブレット走アイスクリームサンドイッチ.これは基本的に株式版ICを除き、その思いに根ざしたタブレットをよりシンプルなプロセスなの交換のOSに提供いたしませんのインタフェース、あるいはヒープサイズを手動で調整されます。

この装置は、こちらの結果は:

  • Novo7
    • maxMemory:62914560
    • getMemoryClass:60

もりKishoreにコメント):

  • HTC One X
    • maxMemory:67108864
    • getMemoryClass:64

(たakauppiのコメント):

  • Samsung Galaxyコアプラス
    • maxMemory:(指定されていないコメント)
    • getMemoryClass:48
    • largeMemoryClass:128

たコメントからcmcromance:

  • Galaxy S3(Jelly Bean)大ヒープ
    • maxMemory:268435456
    • getMemoryClass:64

(たtencent(騰訊)のコメント):

  • LG Nexus5(4.4.3)
    • maxMemory:201326592
    • getMemoryClass:192
  • LG Nexus5(4.4.3)大ヒープ
    • maxMemory:536870912
    • getMemoryClass:192
  • Galaxy Nexus(4.3)通常の
    • maxMemory:100663296
    • getMemoryClass:96
  • Galaxy Nexus(4.3)大ヒープ
    • maxMemory:268435456
    • getMemoryClass:96
  • "Galaxy S4"Playストア版(4.4.2)の通常の
    • maxMemory:201326592
    • getMemoryClass:192
  • "Galaxy S4"Playストア版(4.4.2)の大ヒープ
    • maxMemory:536870912
    • getMemoryClass:192

その他のデバイス

  • ファーウェイネクサス6P(6.0.1)
    • maxMemory:201326592
    • getMemoryClass:192

まだ試これら二つの手法を用いのandroid特別:largeHeap="true"マニフェストオプションから利用ハニカムが、cmcromanceクセスしたいサンプルlargeHeap値として報告されます。

の期待 (これによlargeHeap番号)というこのオプションではないものと類似の設定エディタで開き、ヒープを手動で介に根ざしたOS-すなわち、その価値向上にもつながる maxMemory() ちながら、 getMemoryClass() ます。別の方法getLargeMemoryClass()を示しどのくらいのメモリが許容のためのアプリを使用largeHeapます。ドキュメンテーションにgetLargeMemoryClass()、"ほとんどのアプリケーションを表示させるこの量のメモリにかかわりのある滞在のgetMemoryClass()を制限します。"

いんようした内容を確認し、よろしければ使用するオプションは同一の給付(および危険)としても用のスペースより情報の提供を受けております利用のデータップのヒントを介して根付いたOS(例えばシェアする画面でユーザーの追加メモリでも遊べないものとしても、何らかの形で他のアプリのユーザーは同じ時間)

このメモリのクラスである必要はない複数の8MB.

見てきたように、上記の getMemoryClass() 結果は変わらぬ指定されたデバイス/OSの設定にmaxMemory()値が変化するためにヒープを設定することによっ、ユーザーです。

自分の経験は、G1(メモリのクラス16の場合、私は手動で選択24MBとしてのヒープサイズで走行可能なerroringずしも自分のメモリ使用量が許可されるドリフトに向20MB以上の空き容量が必と思われるもっと高い24MBがいします。その他の同様に大型的でないアプリがフラッシュメモリの結果として、自分のアプリのpigginess.のか、逆に アプリがフラッシュメモリ上からこその高い保守のアプリはフォアグラウンドの利用に最適です。

ではできませんの量のメモリを指定する maxMemory().やるべき 泊限度として指定する getMemoryClass().そのための方法の一つで、ドが制限機能などのデータが保存さい。

最後に、いプランの数メガバイトを指定 getMemoryClass(), 私のアドバイスする仕事では早い時期からの保存修復のアプリの状態とすることにより、ユーザーの経験がほぼ連続の場合 onStop() / onResume() サイクルが発生します。

私の場合、パフォーマンス上の理由により私は限ら私のアプリのデバイスの走行2.2以上、そのほとんどすべてのデバイスの走行マアプリにてmemoryClass24以上とします。いデザインを占める最大20MBのヒープと感じるか自信が私のアプリの遊び次の項目で検索条件を絞その他のアプリのユーザーが走行でも同時に行います。

ものも数に根ざしたユーザーにてロード2.2以上Androidのバージョンを古いデバイス(例えば、G1).きのとの出会いような構成に適するべき伝記憶でもご使用の場合 maxMemory() はないことがおわかり頂け出向くことができるように16MBる getMemoryClass() はないことがおわかり頂けます すべ すーション-ターゲティングとのできない場合には確実にアプリはライブ内の予算、その後少なくともい onStop() / onResume() 作品のシームレスに連携します。

getMemoryClass(), ど、Diane Hackborn(hackbod、ご返APIレベル5(Android2.0)、そして彼女の助言できることを前提とする物理的ハードウェアデバイスの走行前のバージョンのOSでは最適なアプリを占めるヒープスペースがありますが16MB.

逆に、 maxMemory(), によると、ドキュメンテーションまで、すべてのAPIレベル1. maxMemory(), は、前のバージョン2.0わを返し16MB値が とにかく)CyanogenModバージョンのユーザーを選択することができヒープとしての価値の低いては12MB、その結果低いヒープの制限などを提供していることにより継続的に試験を maxMemory() 価値のもののバージョンのOS前2.0にアクセスしてください。しょうもりを拒否す実はこの値を設定してもよ16MBが必要な場合以 maxMemory() 表示が許可されます。

他のヒント

公式 API のです。

  より大きなメモリ装置が登場ここで、

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

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()

Iは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

私はネクサス7の上に私のゲームをプロトタイピングのミスを犯し、そしてそれは私の妻のジェネリック4.04タブレット上でほとんどすぐにメモリ不足discoveringが(memoryclass 48、maxmemory 50331648)

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

あなたはプログラム的に意味するか、またはあなたが開発およびデバッグしている間だけ?後者の場合は、EclipseのDDMSの観点からその情報を見ることができます。あなたのエミュレータ(差し込まれている可能性も物理的な電話機)が実行されている場合は、左側のウィンドウでアクティブなプロセスの一覧が表示されます。あなたはそれを選択することができますし、ヒープの割り当てを追跡するためのオプションがあります。

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

は値がBである

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

の値であるMB

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top