Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.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
Android 字节数组在应用程序中频繁返回OutOfMemory异常_Android_Out Of Memory - Fatal编程技术网

Android 字节数组在应用程序中频繁返回OutOfMemory异常

Android 字节数组在应用程序中频繁返回OutOfMemory异常,android,out-of-memory,Android,Out Of Memory,我有一个问题,我经常遇到OutOfMemory异常,在执行该Java文件20次之后,负责该异常的语句是 byte[]fileData=新字节[2097152] 实际上,我必须在运行时使用字节数组分配这么多内存,但有时堆大小会增加,并且在发生OutOfMemory异常时,无法释放内存来分配更多对象。我在网上搜索了很多,但没有找到任何成功的解决方案。请给我建议这个问题的正确解决办法 错误堆栈: 01-19 16:52:54.437: E/Cursor(5672): at com.androi

我有一个问题,我经常遇到
OutOfMemory异常
,在执行该Java文件20次之后,负责该异常的语句是
byte[]fileData=新字节[2097152]

实际上,我必须在运行时使用字节数组分配这么多内存,但有时堆大小会增加,并且在发生OutOfMemory异常时,无法释放内存来分配更多对象。我在网上搜索了很多,但没有找到任何成功的解决方案。请给我建议这个问题的正确解决办法

错误堆栈:

01-19 16:52:54.437: E/Cursor(5672):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-19 16:52:54.437: E/Cursor(5672):     at dalvik.system.NativeStart.main(Native Method)
01-19 16:52:54.577: I/System.out(5672): 1Record inserted
01-19 16:52:54.878: D/dalvikvm(5672): GC_FOR_MALLOC freed 1323 objects / 1091256 bytes in 35ms

为什么要分配这么大的内存,这个缓冲区是用来存储大媒体文件的吗?是的,实际上我必须从视频文件中获取那么多的数据,这就是为什么我要使用相同的缓冲区。这是强制性的。难道没有其他方法来解决这个问题吗?为什么需要将视频文件的内容存储在内存中?如果您是从网络连接读取数据,您可以将其存储在临时文件中,例如SD卡上,然后从那里引用。如果您只想在视频播放器中显示它,可以直接从流中播放。主要问题是许多android设备每个进程只有16 MB的堆内存。如果您运行此执行20次,您将分配40 MB,很容易耗尽内存。你可以尝试用
System.gc()
强制垃圾收集,但最终你必须重新考虑你的应用程序逻辑。实际上我的视频已经在SD卡中了。有没有其他方法可以解决这个问题,比如读取数据块?为什么要分配这么大的内存,这个缓冲区是用来存储大的媒体文件的?是的,实际上我必须从视频文件中获取那么多的数据,这就是为什么我要使用相同的方法。这是强制性的。难道没有其他方法来解决这个问题吗?为什么需要将视频文件的内容存储在内存中?如果您是从网络连接读取数据,您可以将其存储在临时文件中,例如SD卡上,然后从那里引用。如果您只想在视频播放器中显示它,可以直接从流中播放。主要问题是许多android设备每个进程只有16 MB的堆内存。如果您运行此执行20次,您将分配40 MB,很容易耗尽内存。你可以尝试用
System.gc()
强制垃圾收集,但最终你必须重新考虑你的应用程序逻辑。实际上我的视频已经在SD卡中了。有没有其他方法可以解决这个问题,比如读取数据块?