尝试减少应用程序内存时,我应该记录哪些值?

Trying to reduce app memory, what values should I log?

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

我发现我可以捕获这些值:

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

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

Is that freeMemory value one that would tell me if I'm likely to get an OutOfMemoryError?

可能不会。

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

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

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