Android ZXing库中是否存在内存泄漏?

Android ZXing库中是否存在内存泄漏?,android,memory-leaks,garbage-collection,zxing,eclipse-memory-analyzer,Android,Memory Leaks,Garbage Collection,Zxing,Eclipse Memory Analyzer,我已经使用ZXing库编写了一个Android应用程序,我得到了一个java.lang.OutOfMemoryError 首先,我确信错误在我这边,所以我使用了Patrick Dubroy提供的Eclipse内存分析器(MAT)和其他一些关于如何跟踪内存泄漏的教程,如 在MAT中,我发现随着时间的推移,com.google.zxing.common.BitMatrix的数百个实例占用了我的大部分堆内存 令人惊讶的是,我在原来的ZXing测试程序“CaptureActivity”中遇到了同样的问题

我已经使用ZXing库编写了一个Android应用程序,我得到了一个
java.lang.OutOfMemoryError

首先,我确信错误在我这边,所以我使用了Patrick Dubroy提供的Eclipse内存分析器(MAT)和其他一些关于如何跟踪内存泄漏的教程,如

在MAT中,我发现随着时间的推移,
com.google.zxing.common.BitMatrix
的数百个实例占用了我的大部分堆内存

令人惊讶的是,我在原来的ZXing测试程序“CaptureActivity”中遇到了同样的问题

经过一些调查,我发现
DecodeHandler
类中的活动引用可能会阻止垃圾收集器释放
位矩阵。但我的经验太少,无法证实这一点。此外,我很惊讶在原来的ZXing库(版本2.1)中发现了这个问题


有人能重现这种现象吗?或者曾经经历过这种现象吗?

我认为你的思路是对的。您需要继续查看MAT堆配置文件,以确定用户代码的哪一部分包含对
解码处理程序的引用,以及对
位矩阵的引用。尝试跟踪
位矩阵
中的传入引用,计算支配树并检查泄漏嫌疑犯

尝试分析应用程序以查看代码的哪个部分负责
位矩阵
分配,尝试将其跟踪回应用程序代码

CaptureActivity示例遇到相同问题的事实可能是由于错误使用库造成的,因此不一定证明库正在泄漏内存。例如,当示例保持不变时,库可能已经更新。

我在Android emulator(英特尔版本)上运行的ZXing版本2.3中发现了相同的问题。根本原因似乎是: 在类
FinderPatternFinder
的方法
selectBestPatterns
中,当找不到有效(QR)查找器模式时,将抛出
NotFoundException
。此异常在类
MultiFormatReader
的方法
decodeInternal
中捕获。因此,此异常跳过了一些方法调用的正常返回。我发现,由于这个“异常返回”,没有释放
FinderPatternFinder
的实例,而该实例又保留了
BitMatrix
的引用,该引用占用了相当多的内存。 听起来很疯狂,我不认为这符合Java规范,所以我称之为emulator中的bug。
解决方法是不要依赖异常来表示找不到查找器模式。我在结束方法调用堆栈时返回了一些空结果。这彻底解决了内存泄漏问题。

我从未见过内存泄漏的证据,也想不到会在哪里保存引用。它显示这些是从哪里引用的?这与这个问题有什么关系?如果是真的,那确实是JVM实现中的一个bug。控制流完全正常,与垃圾收集无关。这些元素离开框架堆栈;你认为他们被关在哪里?如果这是真的,那么更有可能的是,仿真JVM GC无法跟上帧处理和声明的速度,因为它的线程花费了太长的时间。@SeanOwen:仿真JVM非常快,因为它在快速虚拟模式下运行英特尔代码。我使用MAT来查找存放堆栈外元素的内容。它展示了这些元素,但却没有抓住它们的东西。您可以在LogCat中看到所使用的内存一直在增长,直到达到极限。