Java Android:OutOfMemory异常在重新打开活动的应用程序中

Java Android:OutOfMemory异常在重新打开活动的应用程序中,java,android,memory-leaks,android-activity,Java,Android,Memory Leaks,Android Activity,我正在编写一个Android应用程序,它允许在对数据执行一些信号处理时回放录制的文件 如果从列表视图中选择了一个文件,则会启动一个新的活动,在其中进行播放和处理。在onBackPressed方法中,我调用finish结束活动并返回列表视图,用户可以在其中选择另一个文件 当多次选择一个小文件或一次选择一个大文件时,所有这些都可以正常工作,但是当再次选择一个大文件时,会引发OutOfMemoryError异常 我已经使用DDMS查看了我的内存堆,很明显,当返回列表视图时,活动中的内存没有被释放。它根

我正在编写一个Android应用程序,它允许在对数据执行一些信号处理时回放录制的文件

如果从列表视图中选择了一个文件,则会启动一个新的活动,在其中进行播放和处理。在onBackPressed方法中,我调用finish结束活动并返回列表视图,用户可以在其中选择另一个文件

当多次选择一个小文件或一次选择一个大文件时,所有这些都可以正常工作,但是当再次选择一个大文件时,会引发OutOfMemoryError异常

我已经使用DDMS查看了我的内存堆,很明显,当返回列表视图时,活动中的内存没有被释放。它根据加载文件的大小进行累积

尽管进行了广泛的研究,我还是无法找出内存泄漏的来源。我已经研究了位图和上下文引用作为原因,但是这些似乎不是问题所在。文件加载本身似乎也不是问题,因为我有另一个类似的活动,使用从麦克风获取的实时音频

1) 内存泄漏的原因可能是什么


2) 如何确保在调用finish/ondestory时释放活动的内存

您可以将“WeakReference”组件附加到大型数据块。这将释放您在需要时持有的旧关联内存块。因此,在另一个文件获取/请求内存后,它将释放那些旧的“WeakReference”块,您的内存问题应该以这种方式解决。这应该是可行的,因为您似乎只需要在指定的时间内使用该文件,通过这种方法,您可以让系统担心何时释放它,而无需担心。

您是否在完成活动时明确关闭该文件?是的,我关闭了该文件(非常确定文件本身不是问题)。我创建了一个简单的测试应用程序,我所做的就是加载一个新的活动并用大量数据填充它(一个500万个元素的大浮动)。一按下按钮我就叫“完成”。这也会导致类似的内存不足异常,在这种情况下,调用system.gc修复了问题。然而,在我的实际应用程序system.gc中似乎没有相同的效果。我知道system.gc不是一个指令,而是一个建议。在完成活动时不关闭为内容打开的文件/db/端口等。无法保证在调用system.gc()后,gc会释放内存。它只是使活动使用的内存符合gcollection的条件。我已经解决了这个问题。1) 调试模式阻止垃圾收集…这是使用小文件时的问题。2) 对于大文件,应用程序似乎无法处理一个接一个地加载大文件(超过最大内存的1/2)。即使旧数据应该被垃圾收集。我的解决方法是在中间加载一个“虚拟”小文件。谢谢,刚刚尝试过。不幸的是,它似乎无法解决问题。如果您只为大内存块分配了弱引用,那么这表示文件中的内存不是问题所在。它可能存在于意外的上下文泄漏或导致问题的递归性质中。您可能必须发布堆栈跟踪和/或代码。