【发布时间】:2017-01-10 21:01:44
【问题描述】:
上下文:
我用 Xamarin.Android 开发了一个应用程序,它可以读取二维码 -datamatrix-(除其他外)。
为了读取二维码,我使用了第三方库 (NeoReader)
应用必须彻底读取数据矩阵(例如 400 次)。
行为如下:
- Activity A 通过调用 Activity B(带摄像头的那个)开始读取
- 活动 B 解码数据矩阵后,将值返回给活动 A
-
Activity A 稍等片刻,从第 1 点开始)
- 可以使用返回键中断循环
我在运行 Android 4.2 的三星 S4 mini 上测试了该应用,它运行良好(至少我没有收到 OutOfMemoryError)
然后我在运行 Android 5.1 的摩托罗拉 Moto G 中测试了该应用程序,在解码 75 和 80 之间的数据矩阵后,我得到了 OutOfMemoryError。
这是出现错误的行:
Java.Lang.OutOfMemoryError: Failed to allocate a 1843212 byte allocation with 1709964 free bytes and 1669KB until OOM
请找到附有完整日志的文件,以防某些慈善人士想为这个问题添加一些亮点:
OutOfMemory.txt
【问题讨论】:
-
在 Android 设备监视器中使用
Allocation Tracker来查看本机发生的情况可能会有所帮助。您还可以使用 Xamarin 分析器查看托管端发生的情况。这些项目将有助于查明分配和未发布的内容。 developer.android.com/studio/profile/investigate-ram.html -
奇怪的建议,但尝试在活动 A 再次启动流程之前调用 GC.Collect()。 Android 上的图片会吃内存,很容易导致 OOM 错误,但是做一个显式的 GC.Collect 可以在内存用完之前把内存清理干净。
-
@JimBobBennett 我已经这样做了,然后在解码大约 90 个数据矩阵时出现 OOM。由于我在 Xamarin 中工作并且我已经构建了一个绑定库以使用 java 库,因此我发现很难确定泄漏的位置。我想我会花适当的时间尝试使用监控工具解决问题。我已经尝试过使用 Xamarin Profiler(我第一次使用它),但这对我没有多大帮助。