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