试图减少应用程序内存,我应该记录什么值?

时间:2017-12-22 13:55:50

标签: android android-memory

我的应用经常耗尽内存。我正在努力减少内存使用量,但我想记录我的用户平均使用的内存量,可用量等,以查看我所做的更改是否对现实世界产生任何影响。

我找到了可以捕获的这些值:

long totalMemory = Runtime.getRuntime().totalMemory();
long freeMemory = Runtime.getRuntime().freeMemory();
long maxMemory = Runtime.getRuntime().maxMemory();

但我不确定那些是正确的。 freeMemory值是否会告诉我是否有可能获得OutOfMemoryError?如果没有,我应记录哪些值?

1 个答案:

答案 0 :(得分:3)

  

freeMemory值是否可以告诉我是否可能会出现OutOfMemoryError?

可能不是。

当您尝试进行分配并且没有足够大的空闲块来满足该请求时,即使在紧急垃圾收集运行之后,也会发生OutOfMemoryError。在Android 7.1及更早版本中,由于垃圾收集器的性质,可能会发生这种情况,因为您的堆会碎片化。 freeMemory()表示所有空闲块的总和,而不是最大空闲块的大小。

因此,您需要查看您遇到的OutOfMemoryError崩溃事件。通常,在Android中,这些将来自大量分配,例如加载Bitmap。如果这是您的崩溃的来源,那么freeMemory()将没什么用处,并且您无法记录任何内容。

另一方面,如果你因为相当小的分配(比如128字节或更低)而崩溃,那么很可能你真的在耗尽你的堆。在这种情况下,freeMemory()可能对记录有用。