10

したがって、Android での課題の 1 つは、さまざまなデバイスの仕様 (特にデバイスのメモリ) です。

モデル オブジェクトは、JavaSoftReferencesを遅延読み込み方式で広く使用するように作成したため、VM はデータ モデルの現在使用されていない部分を必要に応じて再構成するだけで自由に削除できます。

ただし、実際の課題の 1 つSoftReferencesは、VM のメモリが少なくなるまでぶらぶらするのではなく、弱参照になってから数秒以内にクリアされる傾向があることです。多くの場合、メモリに何もないことを意味するため、うまく機能しません。理想的には、十分なメモリを備えたデバイスでは、オブジェクトをメモリに保持することでユーザーが恩恵を受けることができます。

その結果、SoftReferences最近参照されたオブジェクトへのハード ポインターを LRU が保持する LRU メカニズムと組み合わせるのが一般的です。もちろん、これはほとんど参照されないオブジェクトすべてに対して十分なメモリがあることを前提としているため、理想的ではありません。

また、LRU の適切なデフォルトを知ることも難しくなります。

完璧な世界では、Android はメモリ不足のコールバックをヒントとして使用します (したがって、小さな LRU から始めて、メモリ不足のコールバックが発生し始めるまで定期的に増やしてから、デバイスに適した値を見つけるために元に戻すことができます)。 、しかし私の経験では、このコールバックは実際の VM のメモリ プレッシャと一致することはないようです。

データ モデルが特定のデバイスでメモリを使いすぎていることを検出する合理的な方法を見つけた人はいますか?

4

4 に答える 4

2

android で使用可能なメモリを確認したい場合は、パースペクティブで確認または移動できます- > ddms 2) 2番目に、使用済みおよび未使用のメモリでチェックされたメモリアナライザーツールを使用でき、メモリの可用性も確認できます。

于 2013-02-04T11:08:26.427 に答える
1

Android NDK を使用する場合:

#include <unistd.h>

size_t getTotalSystemMemory()
{
    long pages = sysconf(_SC_PHYS_PAGES);
    long page_size = sysconf(_SC_PAGE_SIZE);
    return pages * page_size;
}

size_t getFreeSystemMemory()
{
    long pages = sysconf(_SC_AVPHYS_PAGES);
    long page_size = sysconf(_SC_PAGE_SIZE);
    return pages * page_size;
}

于 2013-01-26T17:12:06.223 に答える
0

これは機能しますか?

MemoryInfo mi = new MemoryInfo();
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
activityManager.getMemoryInfo(mi);
long availableMegs = mi.availMem / 1048576L;
于 2012-10-02T19:44:08.900 に答える