我的应用经常耗尽内存。我正在努力减少内存使用量,但我想记录我的用户平均使用的内存量,可用量等,以查看我所做的更改是否对现实世界产生任何影响。
我找到了可以捕获的这些值:
long totalMemory = Runtime.getRuntime().totalMemory();
long freeMemory = Runtime.getRuntime().freeMemory();
long maxMemory = Runtime.getRuntime().maxMemory();
但我不确定那些是正确的。 freeMemory
值是否会告诉我是否有可能获得OutOfMemoryError
?如果没有,我应记录哪些值?
答案 0 :(得分:3)
freeMemory值是否可以告诉我是否可能会出现OutOfMemoryError?
可能不是。
当您尝试进行分配并且没有足够大的空闲块来满足该请求时,即使在紧急垃圾收集运行之后,也会发生OutOfMemoryError
。在Android 7.1及更早版本中,由于垃圾收集器的性质,可能会发生这种情况,因为您的堆会碎片化。 freeMemory()
表示所有空闲块的总和,而不是最大空闲块的大小。
因此,您需要查看您遇到的OutOfMemoryError
崩溃事件。通常,在Android中,这些将来自大量分配,例如加载Bitmap
。如果这是您的崩溃的来源,那么freeMemory()
将没什么用处,并且您无法记录任何内容。
另一方面,如果你因为相当小的分配(比如128字节或更低)而崩溃,那么很可能你真的在耗尽你的堆。在这种情况下,freeMemory()
可能对记录有用。