确定Android上的可用内存

时间:2012-09-18 13:25:33

标签: java android memory-management android-ndk

因此Android上的挑战之一是各种设备规格(特别是设备内存)。

我已经编写了模型对象以便以惰性加载的方式广泛使用Java SoftReferences,因此VM可以自由地修剪当前使用的数据模型部分并且它们只是重构为需要的。

然而,SoftReferences在实践中遇到的一个挑战是,它们往往会在几秒内被清除而变得弱引用,而不是在VM内存不足的情况下徘徊,因此它们在允许模型修剪,但它们不能正常工作,因为它通常意味着内存中没有任何内容。理想情况下,在具有足够内存的设备上,您可以让用户将对象保留在内存中。

因此,将SoftReferences与LRU机制相结合是很常见的,其中LRU保持指向最近引用的对象的硬指针。这当然不理想,因为它假定你有足够的内存用于所有这些几乎没有引用的对象。

了解LRU的良好默认值也是一项挑战。

在一个完美的世界中,Android会使用它的低内存回调作为提示(因此我可以从一个小型LRU开始,并定期将其提升,直到开始发生低内存回调,然后将其返回到 find < / em>一个设备的好价值),但根据我的经验,这个回调似乎永远不会与实际的VM内存压力一致。

有没有人遇到过检测您的数据模型在特定设备上使用过多内存的合理方法?

4 个答案:

答案 0 :(得分:2)

如果你想确定android中的可用内存,那么你可以检查或进入     透视 - &gt; ddms                                                                                                       2)第二件事是你可以使用内存分析器工具检查已使用和未使用的内存,你也检查    记忆的可用性。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

这会有用吗?

MemoryInfo mi = new MemoryInfo();
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
activityManager.getMemoryInfo(mi);
long availableMegs = mi.availMem / 1048576L;

答案 3 :(得分:0)

这是更详细的NDK答案:

查看Bionic LibC source for sysconf可以发现_SC_PHYS_PAGES_SC_AVPHYS_PAGES是通过读取/proc/meminfo来实现的,该MemTotal: 3721064 kB MemFree: 208108 kB MemAvailable: 2543032 kB 由Linux内核维护。我正在使用的具有4GB RAM的Lenovo Android 7.0.1设备上该文件的前几行如下:

sysconf( _SC_PHYS_PAGES)
  • MemTotal为您提供sysconf( _SC_AVPHYS_PAGES)值,以页面大小为单位。这似乎是Android可用于代码,数据等的总内存。它比我正在使用的设备上要求的物理RAM少300MB,这可能是由屏幕缓冲区等引起的。
  • MemFree以相同单位为您提供MemAvailable值。这似乎是根本没有使用任何内存。在我的4GB设备上,只有大约200MB。

遗憾的是,没有更有用的MemAvailable值的sysconf参数,该值是可以根据需要提供的RAM。显然这是因为MemAvailable仅在2014年初才添加到Linux内核,而sysconf()支持似乎早于此。 MemAvailable不在Samsung Android 5.0中,但在Amazon FireOS 5.6(基于Android 5.1)和Motorola Android 7.1中;我不知道6.x。

我打算为NDK测试工具(不是将要分发的应用程序)做的事情是,最简单的方法是使用/proc/meminfo,否则使用一半。物理RAM大小。由于我将不得不阅读MemAvailable来找出{{1}}是否存在,因此如果我调用sysconf(),让Bionic LibC再次读取它是没有意义的。