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