我的android应用程序有一个功能,它向服务器发送指定数量的数据。我习惯在电脑程序上这样做,但是android在内存使用方面需要更加小心,因为当用户指定大量数据(例如1gb)时,我会被抛出outofmemory错误。在上传之前,数据临时存储在字节数组中,因此我决定不一次性发送所有数据(这会触发错误,因为字节数组的大小会导致超出允许的最大内存),而是以较小的迭代方式发送。为了实现这一点,我需要知道有多少内存可供我的应用程序使用,然后将其拆分。我目前正在开发的应用程序的api 27(android 8.1)和api 30(q)的最高最低限度。我的测试设备是api 29(android 10)。
我在网上找到了很多答案,其中一部分困惑来自于android是如何每隔几年改变一次幕后管理的不同方面的,而内存管理显然是android o的始作俑者之一。我现在知道这更多地取决于设备和可用的ram,但我不是在做假设,我只是需要一种方法来找到这些值。
我找到的两个答案要么使用activitymanager的memoryinfo,要么使用java的运行时。我应该用哪一个?
我运行这两个方法并记录它们,以获取它们返回的值。我还重新运行它们,将large heap manifest选项设置为true。代码:
ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
activityManager.getMemoryInfo(mi);
Log.d("Service", "Total Memory: " + mi.totalMem);
Log.d("Service", "Available Memory: " + mi.availMem);
Log.d("Service", "Memory Threshold: " + mi.threshold);
Runtime runtime = Runtime.getRuntime();
long maxHeap = runtime.maxMemory();
long heap = runtime.totalMemory();
long freeHeap = runtime.freeMemory();
Log.d("Service", "Max Heap: " + maxHeap);
Log.d("Service", "Total Heap: " + heap);
Log.d("Service", "Free Heap: " + freeHeap);
大堆日志:
Total Memory: 5850189824
Available Memory: 2423918592
Memory Threshold: 226492416
Max Heap: 536870912
Total Heap: 9175744
Free Heap: 5092288
常规堆日志:
Total Memory: 5850189824
Available Memory: 2363342848
Memory Threshold: 226492416
Max Heap: 268435456
Total Heap: 9224552
Free Heap: 5190720
当设置了large heap选项时,我看到运行时的max heap size增加了,但是total heap和free heap值仍然几乎相同,这也让我感到困惑。我的直觉是使用运行时,但其他解决方案甚至android开发者的内存管理页面都使用activitymanager
暂无答案!
目前还没有任何答案,快来回答吧!