Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.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上预分配最大堆空间_Java_Android - Fatal编程技术网

Java 如何在Android上预分配最大堆空间

Java 如何在Android上预分配最大堆空间,java,android,Java,Android,我正在开发一个需要大量堆空间的图像处理应用程序,并通过网络发送这些图像。问题是,每个图像都会产生如下消息 Grow heap (frag case) to 16.38M for 1536000 byte allocation 这一增长似乎需要很长时间,因为当我从计算机发送图像时需要1秒,而我的android应用程序大约需要1分30秒 我的问题是,有没有办法预先分配最大堆大小,这样堆就不必不断增长 。。。有没有办法预先分配最大堆大小,以便堆不必不断增长 我不这么认为。通读Android内存管理

我正在开发一个需要大量堆空间的图像处理应用程序,并通过网络发送这些图像。问题是,每个图像都会产生如下消息

Grow heap (frag case) to 16.38M for 1536000 byte allocation 
这一增长似乎需要很长时间,因为当我从计算机发送图像时需要1秒,而我的android应用程序大约需要1分30秒

我的问题是,有没有办法预先分配最大堆大小,这样堆就不必不断增长

。。。有没有办法预先分配最大堆大小,以便堆不必不断增长

我不这么认为。通读Android内存管理没有任何发现

在经典Java中,可以设置初始堆大小,以避免不断增加堆的性能开销。但安卓系统的假设似乎是,您应该始终尽量减少内存使用

如果简单地分配一个非常大的数组并立即使其无法访问,您可能会得到一些“乐趣”。GC应该增长堆以便它可以容纳数组。。。阵列占用的空间通常会被回收,并在下一个GC循环中可用。另一方面,当GC回收大量内存时,它可能会收缩堆以将大部分空间返回给操作系统


话虽如此,你可能会被建议更改你的应用程序,这样它就不需要在内存中保存很多图像。我觉得你可能有某种类型的内存泄漏。请阅读以下链接:


您如何通过网络发送图像?您是否尝试先将所有图像加载到内存中,然后写入输出缓冲区?如果是这样,那么你使用了错误的方法,我的朋友。图像在内存中,因为我是从opencv摄像头侦听器获取的。然后我将opencv摄影机帧转换为字节数组,因为opencv帧不可序列化。另外,我正在使用Apache的XmlRpc框架发送byte[],该框架以1024字节的块作为base64发送数组。感谢您的精彩响应。我不认为我有内存泄漏,因为即使我的内存中只有一个映像,而且每次堆会增长到16-17MB左右,也会发生内存泄漏。内存中只有1的原因是因为我在本机堆空间中有映像,然后我一次转换一个映像以序列化它们。我还在Eclipse堆和分配查看器中检查了这一点。