android - 如何诊断 Xamarin Android 弱引用表溢出的原因?

标签 android memory xamarin java-native-interface

我收到多位用户的报告,称我的应用程序在密集使用约 5 分钟后崩溃了。我在 Google Play 上收到了崩溃日志,下面附有一个示例。消息似乎是:

JNI 错误(应用错误):弱全局引用表溢出 (max=51200)'

我对 JNI 不熟悉,如果有任何关于如何解决这个问题的建议/解释/建议,我将不胜感激。可能的原因是我的代码中的某些内容没有得到清理,但是什么?

已报告此问题的设备是 Nexus 5.xGalaxy S7Nexus 6

相关代码可以在我的开源项目中找到:https://gitlab.com/hodgskin-callan/Invention .但是,我没有重现该问题的最低代码,而且它不会在我的 Nexus 9 上重现。我怀疑这个问题不会影响大多数 Android 用户。

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'google/bullhead/bullhead:7.1.1/N4F26T/3687331:user/release-keys'
Revision: 'rev_1.0'
ABI: 'arm'
pid: 10404, tid: 10404, name: .x10host.pathos  >>> com.x10host.pathos <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'art/runtime/indirect_reference_table.cc:132] JNI ERROR (app bug): weak global reference table overflow (max=51200)'
    r0 00000000  r1 000028a4  r2 00000006  r3 00000008
    r4 f300558c  r5 00000006  r6 f3005534  r7 0000010c
    r8 00000000  r9 0000000a  sl 00001785  fp f0385400
    ip 0000000b  sp ffde7b50  lr f1a065e7  pc f1a08e44  cpsr 200f0010

backtrace:
    #00 pc 00049e44  /system/lib/libc.so (tgkill+12)
    #01 pc 000475e3  /system/lib/libc.so (pthread_kill+34)
    #02 pc 0001d8a5  /system/lib/libc.so (raise+10)
    #03 pc 000193f1  /system/lib/libc.so (__libc_android_abort+34)
    #04 pc 00017034  /system/lib/libc.so (abort+4)
    #05 pc 0031a5f1  /system/lib/libart.so (_ZN3art7Runtime5AbortEPKc+328)
    #06 pc 000b5205  /system/lib/libart.so (_ZN3art10LogMessageD2Ev+1132)
    #07 pc 001bc42b  /system/lib/libart.so (_ZN3art22IndirectReferenceTable3AddEjPNS_6mirror6ObjectE+194)
    #08 pc 0023a097  /system/lib/libart.so (_ZN3art9JavaVMExt16AddWeakGlobalRefEPNS_6ThreadEPNS_6mirror6ObjectE+46)
    #09 pc 0027f483  /system/lib/libart.so (_ZN3art3JNI16NewWeakGlobalRefEP7_JNIEnvP8_jobject+418)
    #10 pc 0000de14  /data/app/com.x10host.pathos-2/lib/arm/libmonodroid.soapp/com.x10host.pathos-2/lib/arm/libmonodroid.so

最佳答案

这里有一篇关于这个主题的很长但非常有用的文档:

https://developer.xamarin.com/guides/android/troubleshooting/troubleshooting/#Global_Reference_Messages

对于第一次通过,您应该尝试通过 .txt 文件启用系统属性,该文件的 Build Action 设置为 $(AndroidEnvironment) :

debug.mono.log gref

https://developer.xamarin.com/guides/android/advanced_topics/environment/#Xamarin.Android_System_Properties

然后您将从设备中获取包含此日志记录的 adb logcat

但是,如果这对您不利:

您应该可以通过以下方式直接查询:

Java.Interop.JniRuntime.CurrentRuntime.GlobalReferenceCount

Java.Interop.JniRuntime.CurrentRuntime.WeakGlobalReferenceCount

本地引用也在 Java.Interop.JniEnvironment.LocalReferenceCount 中进行跟踪,这是一个线程本地值。

关于android - 如何诊断 Xamarin Android 弱引用表溢出的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43403968/

相关文章:

android - 链接 OpenCV 库的顺序是什么?

linux - linux下free的结果和dmidecode的结果有什么区别?

c - 如何在 Linux 中获取文件中某个位置的物理地址

c++ - `delete this;` 语句期间发生了什么?

c# - 'Xamarin.Forms.Label' 和 'System.Reflection.Emit.Label' 之间的模糊引用

android - Material Design、AppCompat 和向后兼容性

android - 通过模拟器设置温度

java - Android:处理 Fragment 内的用户输入

c# - 使用 View 寻呼机在 fragment 中选择的选项卡上重新加载数据

android - 罢工 html 标签不呈现在 EditText 与 TextFormatted