Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android正在确定应用程序在触发OutOfMemoryError之前剩余的内存量_Java_Android_Android Memory - Fatal编程技术网

Java Android正在确定应用程序在触发OutOfMemoryError之前剩余的内存量

Java Android正在确定应用程序在触发OutOfMemoryError之前剩余的内存量,java,android,android-memory,Java,Android,Android Memory,我的Android应用程序有一个功能,可以向服务器发送指定数量的数据。我习惯在计算机程序上这样做,但Android在内存使用方面需要更加小心,因为当用户指定大量数据(例如1GB)时,我会被抛出OutOfMemory错误。在上传数据之前,数据临时存储在字节数组中,因此我决定不一次发送所有数据(这会触发错误,因为字节数组大小超出了允许的最大内存),而是以较小的大小迭代发送。要实现这一点,我需要知道我的应用程序有多少可用内存,然后再将其拆分。我目前正在开发的应用程序最低API 27(安卓8.1),最高

我的Android应用程序有一个功能,可以向服务器发送指定数量的数据。我习惯在计算机程序上这样做,但Android在内存使用方面需要更加小心,因为当用户指定大量数据(例如1GB)时,我会被抛出OutOfMemory错误。在上传数据之前,数据临时存储在字节数组中,因此我决定不一次发送所有数据(这会触发错误,因为字节数组大小超出了允许的最大内存),而是以较小的大小迭代发送。要实现这一点,我需要知道我的应用程序有多少可用内存,然后再将其拆分。我目前正在开发的应用程序最低API 27(安卓8.1),最高API 30(Q)。我的测试设备是API 29(Android 10)

我在网上找到了多个答案,其中一部分困惑来自于安卓每隔几年会改变后台管理的不同方面,而内存管理显然是安卓O的起点之一。我现在知道这更多地取决于设备和可用RAM,但我并没有对此做出假设,我只是需要一种方法来找到那些值

我找到的两个答案使用了ActivityManager的MemoryInfo或java的运行时。我应该用哪一个

我运行这两种方法并记录它们,以获取它们返回的值。我还将大型堆清单选项设置为true,重新运行它们。代码:

ActivityManager.MemoryInfo mi=新建ActivityManager.MemoryInfo();
ActivityManager ActivityManager=(ActivityManager)getSystemService(ACTIVITY_服务);
activityManager.getMemoryInfo(mi);
Log.d(“服务”,“总内存:+mi.totalMem”);
Log.d(“服务”,“可用内存:+mi.availMem”);
Log.d(“服务”,“内存阈值:+mi.Threshold”);
Runtime=Runtime.getRuntime();
long maxHeap=runtime.maxMemory();
long heap=runtime.totalMemory();
long freeHeap=runtime.freemory();
Log.d(“服务”,“最大堆:”+maxHeap);
Log.d(“服务”,“总堆:”+堆);
Log.d(“服务”,“空闲堆:”+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
常规堆日志:

    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
我看到当设置了大堆选项时,运行时的最大堆大小增加了,但是总堆值和空闲堆值仍然几乎相同,这也让我感到困惑。我的直觉是使用运行时,但其他解决方案,甚至Android开发者关于内存管理的页面都使用ActivityManager