android在触发outofmemoryerror之前确定应用程序剩余的内存量

vd2z7a6w  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(201)

我的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

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题