Sim*_*nix 6 android google-maps memory-leaks out-of-memory android-fragments
这些崩溃在支持我的主要活动时间歇性地发生,主要活动由两个片段组成(一个是谷歌地图支持片段).如果不是我们的崩溃跟踪系统,我不知道用户会遇到这种情况,因为它在我的任何物理或仿真设备上都不可重复.它涵盖了我的15分钟到22分的目标之间的各种API.
在崩溃系统中,崩溃以两种形式之一发生:
java.lang.OutOfMemoryError: android.support.v4.app.BackStackState[] of length 1279544898 would overflow
Run Code Online (Sandbox Code Playgroud)
要么
java.lang.OutOfMemoryError: Failed to allocate a 5118179604 byte allocation with 16777216 free bytes and 472MB until OOM near/at g.newArray:174
Run Code Online (Sandbox Code Playgroud)
崩溃发生在包含我的地图的片段的onViewCreated方法中:
mMapView.onCreate(savedInstanceState);
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是内存泄漏,但是...在创建backstack时看起来像是循环 - 好像背板的索引已经溢出了long.Leak Canary没有发现任何内存泄漏(除了我的MainApplication,我知道它保留了对上下文的静态引用).如果它是一个典型的内存泄漏,这似乎很奇怪这次崩溃将始终发生在同一条线上,而不是其他地方.这个应用程序还有其他内存密集区域(这是企业,所以我不能透露太多),但是其他活动都没有抛出OOM错误.
我还应该注意,这是一个成熟的应用程序,有许多用户和版本.OOM问题仅发生在我们当前版本的测试版中(同样,仅基于我们的碰撞跟踪系统的记录,因为我们无法在任何地方进行复制).我已经在我们的生产版本和测试版之间进行了彻底的代码比较,并且大多数更改都是相对标准/琐碎的.(我还没有开始添加新的位图或任何东西.)
规格:
其他人看到这个?我可以看到崩溃正在发生,但是当我无法重现它时很难找到...
回答我自己的问题...
我能够通过在开发人员选项中启用“不保留活动”来重现该错误。
经过三天的测试,我最终发现我们的构建服务器正在编译支持 24,而不是我在 Gradle 中指定的支持 22。显然,支持 24 和 Android 地图之间存在一些不兼容性。通过改变:
compile 'com.android.support:support-v4:22.2.0'
Run Code Online (Sandbox Code Playgroud)
到
compile('com.android.support:support-v4:22.2.0') {
force = true
}
Run Code Online (Sandbox Code Playgroud)
因此迫使 Gradle 采取 22 而不是后来可用的 24,循环后堆栈消失了。现在,我不再在我们的测试版用户中看到 OOM。
我推测这与 API 的权限模型更改有关,但谁知道呢。
无论如何...希望这对某人有帮助。