JNI ERROR (app bug): global reference table overflow (max=51200)global reference table dump:问题记录

遇到问题

项目使用usb扫码模块,连续扫码压测5w+次失败,并且两台设备都有复现问题。

分析记录

2.1 mtklog 分析 main log

 07-04 14:14:02.185770  4007 17506 F rio.platformsd: java_vm_ext.cc:638] JNI ERROR (app bug): global reference table overflow (max=51200)global reference table dump:
07-04 14:14:02.185819  4007 17506 F rio.platformsd: java_vm_ext.cc:638]   Last 10 entries (of 51200):
07-04 14:14:02.185828  4007 17506 F rio.platformsd: java_vm_ext.cc:638]     51199: 0x12d322b0 com.decard.driver.usb.UsbPortJManage
07-04 14:14:02.185835  4007 17506 F rio.platformsd: java_vm_ext.cc:638]     51198: 0x12e802c0 com.platformsdk.core.service.PlatformService
07-04 14:14:02.185842  4007 17506 F rio.platformsd: java_vm_ext.cc:638]     51197: 0x12e802c0 com.platformsdk.core.service.PlatformService
07-04 14:14:02.185848  4007 17506 F rio.platformsd: java_vm_ext.cc:638]     51196: 0x12e802c0 com.platformsdk.core.service.PlatformService
07-04 14:14:02.185855  4007 17506 F rio.platformsd: java_vm_ext.cc:638]     51195: 0x12e802c0 com.platformsdk.core.service.PlatformService
07-04 14:14:02.185861  4007 17506 F rio.platformsd: java_vm_ext.cc:638]     51194: 0x12e802c0 com.platformsdk.core.service.PlatformService
07-04 14:14:02.185868  4007 17506 F rio.platformsd: java_vm_ext.cc:638]     51193: 0x12e802c0 com.platformsdk.core.service.PlatformService
07-04 14:14:02.185875  4007 17506 F rio.platformsd: java_vm_ext.cc:638]     51192: 0x12e802c0 com.platformsdk.core.service.PlatformService
07-04 14:14:02.185881  4007 17506 F rio.platformsd: java_vm_ext.cc:638]     51191: 0x12e802c0 com.platformsdk.core.service.PlatformService
07-04 14:14:02.185886  4007 17506 F rio.platformsd: java_vm_ext.cc:638]     51190: 0x12e802c0 com.platformsdk.core.service.PlatformService
07-04 14:14:02.185893  4007 17506 F rio.platformsd: java_vm_ext.cc:638]   Summary:
07-04 14:14:02.185900  4007 17506 F rio.platformsd: java_vm_ext.cc:638]     50609 of com.platformsdk.core.service.PlatformService (1 unique instances)
07-04 14:14:02.185906  4007 17506 F rio.platformsd: java_vm_ext.cc:638]       310 of java.lang.Class (225 unique instances)
07-04 14:14:02.185913  4007 17506 F rio.platformsd: java_vm_ext.cc:638]       257 of java.nio.DirectByteBuffer (231 unique instances)
07-04 14:14:02.185919  4007 17506 F rio.platformsd: java_vm_ext.cc:638]         3 of android.os.RemoteCallbackList$Callback (3 unique instances)
07-04 14:14:02.185925  4007 17506 F rio.platformsd: java_vm_ext.cc:638]         2 of dalvik.system.PathClassLoader (1 unique instances)
07-04 14:14:02.185931  4007 17506 F rio.platformsd: java_vm_ext.cc:638]         2 of android.opengl.EGLDisplay (1 unique instances)
07-04 14:14:02.185938  4007 17506 F rio.platformsd: java_vm_ext.cc:638]         2 of android.opengl.EGLSurface (1 unique instances)
07-04 14:14:02.185944  4007 17506 F rio.platformsd: java_vm_ext.cc:638]         2 of android.opengl.EGLContext (1 unique instances)
07-04 14:14:02.185950  4007 17506 F rio.platformsd: java_vm_ext.cc:638]         2 of java.lang.String (2 unique instances)
07-04 14:14:02.185957  4007 17506 F rio.platformsd: java_vm_ext.cc:638]         2 of java.lang.ThreadGroup (2 unique instances)
07-04 14:14:02.185963  4007 17506 F rio.platformsd: java_vm_ext.cc:638]         1 of com.platformsdk.core.binder.DeviceDriverBinder
07-04 14:14:02.185970  4007 17506 F rio.platformsd: java_vm_ext.cc:638]         1 of com.platformsdk.core.service.PlatformService$3
07-04 14:14:02.185976  4007 17506 F rio.platformsd: java_vm_ext.cc:638]         1 of com.decard.driver.usb.UsbPortJManage
07-04 14:14:02.185983  4007 17506 F rio.platformsd: java_vm_ext.cc:638]         1 of com.platformsdk.core.binder.ScannerDriverBinder
07-04 14:14:02.185989  4007 17506 F rio.platformsd: java_vm_ext.cc:638]         1 of dalvik.system.VMRuntime
07-04 14:14:02.185995  4007 17506 F rio.platformsd: java_vm_ext.cc:638]         1 of android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback
07-04 14:14:02.186002  4007 17506 F rio.platformsd: java_vm_ext.cc:638]         1 of android.os.PersistableBundle$1
07-04 14:14:02.186008  4007 17506 F rio.platformsd: java_vm_ext.cc:638]         1 of android.app.ActivityThread$ApplicationThread
07-04 14:14:02.186014  4007 17506 F rio.platformsd: java_vm_ext.cc:638]         1 of android.app.LoadedApk$ReceiverDispatcher$InnerReceiver
07-04 14:14:02.186020  4007 17506 F rio.platformsd: java_vm_ext.cc:638] 

2.2 调整平台服务(platformsd)的扫码调用的逻辑去掉,仅压测流程没有出现jni全局引用泄露导致crash的问题。

2.3 使用供应商提供的测试demo压测也复现到问题。

07-08 23:47:52.138652 25404 25487 F example.iccdem: java_vm_ext.cc:638] JNI ERROR (app bug): global reference table overflow (max=51200)global reference table dump:
07-08 23:47:52.138736 25404 25487 F example.iccdem: java_vm_ext.cc:638]   Last 10 entries (of 51199):
07-08 23:47:52.138753 25404 25487 F example.iccdem: java_vm_ext.cc:638]     51198: 0x14e8a318 android.app.Application
07-08 23:47:52.138767 25404 25487 F example.iccdem: java_vm_ext.cc:638]     51197: 0x14e8a318 android.app.Application
07-08 23:47:52.138782 25404 25487 F example.iccdem: java_vm_ext.cc:638]     51196: 0x14e8a318 android.app.Application
07-08 23:47:52.138796 25404 25487 F example.iccdem: java_vm_ext.cc:638]     51195: 0x14e8a318 android.app.Application
07-08 23:47:52.138810 25404 25487 F example.iccdem: java_vm_ext.cc:638]     51194: 0x14e8a318 android.app.Application
07-08 23:47:52.138825 25404 25487 F example.iccdem: java_vm_ext.cc:638]     51193: 0x14e8a318 android.app.Application
07-08 23:47:52.138839 25404 25487 F example.iccdem: java_vm_ext.cc:638]     51192: 0x14e8a318 android.app.Application
07-08 23:47:52.138853 25404 25487 F example.iccdem: java_vm_ext.cc:638]     51191: 0x14e8a318 android.app.Application
07-08 23:47:52.138866 25404 25487 F example.iccdem: java_vm_ext.cc:638]     51190: 0x14e8a318 android.app.Application
07-08 23:47:52.138880 25404 25487 F example.iccdem: java_vm_ext.cc:638]     51189: 0x14e8a318 android.app.Application
07-08 23:47:52.138894 25404 25487 F example.iccdem: java_vm_ext.cc:638]   Summary:
07-08 23:47:52.138908 25404 25487 F example.iccdem: java_vm_ext.cc:638]     50600 of android.app.Application (1 unique instances)
07-08 23:47:52.138924 25404 25487 F example.iccdem: java_vm_ext.cc:638]       315 of java.lang.Class (229 unique instances)
07-08 23:47:52.138938 25404 25487 F example.iccdem: java_vm_ext.cc:638]       257 of java.nio.DirectByteBuffer (231 unique instances)
07-08 23:47:52.138952 25404 25487 F example.iccdem: java_vm_ext.cc:638]         2 of dalvik.system.PathClassLoader (1 unique instances)
07-08 23:47:52.138966 25404 25487 F example.iccdem: java_vm_ext.cc:638]         2 of android.opengl.EGLDisplay (1 unique instances)
07-08 23:47:52.138980 25404 25487 F example.iccdem: java_vm_ext.cc:638]         2 of android.opengl.EGLSurface (1 unique instances)
07-08 23:47:52.138994 25404 25487 F example.iccdem: java_vm_ext.cc:638]         2 of android.opengl.EGLContext (1 unique instances)
07-08 23:47:52.139007 25404 25487 F example.iccdem: java_vm_ext.cc:638]         2 of java.lang.String (2 unique instances)
07-08 23:47:52.139021 25404 25487 F example.iccdem: java_vm_ext.cc:638]         2 of java.lang.ThreadGroup (2 unique instances)
07-08 23:47:52.139036 25404 25487 F example.iccdem: java_vm_ext.cc:638]         2 of java.lang.ref.WeakReference (2 unique instances)
07-08 23:47:52.139049 25404 25487 F example.iccdem: java_vm_ext.cc:638]         1 of dalvik.system.VMRuntime
07-08 23:47:52.139063 25404 25487 F example.iccdem: java_vm_ext.cc:638]         1 of android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper
07-08 23:47:52.139078 25404 25487 F example.iccdem: java_vm_ext.cc:638]         1 of android.view.ViewRootImpl$AccessibilityInteractionConnection
07-08 23:47:52.139091 25404 25487 F example.iccdem: java_vm_ext.cc:638]         1 of android.view.WindowManagerGlobal$1
07-08 23:47:52.139105 25404 25487 F example.iccdem: java_vm_ext.cc:638]         1 of android.content.ContentProvider$Transport
07-08 23:47:52.139119 25404 25487 F example.iccdem: java_vm_ext.cc:638]         1 of android.hardware.input.InputManager$InputDevicesChangedListener
07-08 23:47:52.139132 25404 25487 F example.iccdem: java_vm_ext.cc:638]         1 of android.view.inputmethod.InputMethodManager$1
07-08 23:47:52.139147 25404 25487 F example.iccdem: java_vm_ext.cc:638]         1 of android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback
07-08 23:47:52.139162 25404 25487 F example.iccdem: java_vm_ext.cc:638]         1 of android.view.accessibility.AccessibilityManager$1
07-08 23:47:52.139176 25404 25487 F example.iccdem: java_vm_ext.cc:638]         1 of android.os.PersistableBundle$1
07-08 23:47:52.139189 25404 25487 F example.iccdem: java_vm_ext.cc:638]         1 of android.view.ViewRootImpl$W
07-08 23:47:52.139203 25404 25487 F example.iccdem: java_vm_ext.cc:638]         1 of android.app.ActivityThread$ApplicationThread
07-08 23:47:52.139217 25404 25487 F example.iccdem: java_vm_ext.cc:638]         1 of android.view.ThreadedRenderer$ProcessInitializer$1
07-08 23:47:52.139231 25404 25487 F example.iccdem: java_vm_ext.cc:638] 
 
07-08 23:47:52.494945 25404 25487 F example.iccdem: runtime.cc:558]   native: #00 pc 00000000003c7abc  /system/lib64/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, int, BacktraceMap*, char const*, art::ArtMethod*, void*, bool)+220)
07-08 23:47:52.494957 25404 25487 F example.iccdem: runtime.cc:558]   native: #01 pc 0000000000496554  /system/lib64/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool, BacktraceMap*, bool) const+412)
07-08 23:47:52.494967 25404 25487 F example.iccdem: runtime.cc:558]   native: #02 pc 00000000004b06ec  /system/lib64/libart.so (art::DumpCheckpoint::Run(art::Thread*)+996)
07-08 23:47:52.494977 25404 25487 F example.iccdem: runtime.cc:558]   native: #03 pc 00000000004a9390  /system/lib64/libart.so (art::ThreadList::RunCheckpoint(art::Closure*, art::Closure*)+488)
07-08 23:47:52.494987 25404 25487 F example.iccdem: runtime.cc:558]   native: #04 pc 00000000004a85bc  /system/lib64/libart.so (art::ThreadList::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool)+500)
07-08 23:47:52.494998 25404 25487 F example.iccdem: runtime.cc:558]   native: #05 pc 000000000046b168  /system/lib64/libart.so (art::Runtime::Abort(char const*)+392)
07-08 23:47:52.495008 25404 25487 F example.iccdem: runtime.cc:558]   native: #06 pc 0000000000008d2c  /system/lib64/libbase.so (android::base::LogMessage::~LogMessage()+724)
07-08 23:47:52.495018 25404 25487 F example.iccdem: runtime.cc:558]   native: #07 pc 00000000002e9e28  /system/lib64/libart.so (art::JavaVMExt::AddGlobalRef(art::Thread*, art::ObjPtr<art::mirror::Object>)+304)
07-08 23:47:52.495028 25404 25487 F example.iccdem: runtime.cc:558]   native: #08 pc 0000000000331f6c  /system/lib64/libart.so (art::JNI::NewGlobalRef(_JNIEnv*, _jobject*)+612)
07-08 23:47:52.495038 25404 25487 F example.iccdem: runtime.cc:558]   native: #09 pc 00000000000fe348  /system/lib64/libart.so (art::(anonymous namespace)::CheckJNI::NewRef(char const*, _JNIEnv*, _jobject*, art::IndirectRefKind)+760)
07-08 23:47:52.495049 25404 25487 F example.iccdem: runtime.cc:558]   native: #10 pc 0000000000085a7c  /data/app/com.example.iccdemo-EFMIdntxcXmIwQab6BTeNg==/base.apk (offset 8d000) (_JNIEnv::NewGlobalRef(_jobject*)+40)  #申请全局引用日志
07-08 23:47:52.495058 25404 25487 F example.iccdem: runtime.cc:558]   native: #11 pc 0000000000154c68  /data/app/com.example.iccdemo-EFMIdntxcXmIwQab6BTeNg==/base.apk (offset 8d000) (UsbPortJManage::UsbPortJManage(_JNIEnv*)+900)
07-08 23:47:52.495069 25404 25487 F example.iccdem: runtime.cc:558]   native: #12 pc 0000000000090454  /data/app/com.example.iccdemo-EFMIdntxcXmIwQab6BTeNg==/base.apk (offset 8d000) (UsbAdapter::UsbAdapter(int)+348)
07-08 23:47:52.495079 25404 25487 F example.iccdem: runtime.cc:558]   native: #13 pc 000000000008fb4c  /data/app/com.example.iccdemo-EFMIdntxcXmIwQab6BTeNg==/base.apk (offset 8d000) (LocalCreateAdapter(char const*, AdapterInterface**)+192)
07-08 23:47:52.495090 25404 25487 F example.iccdem: runtime.cc:558]   native: #14 pc 0000000000212ac0  /data/app/com.example.iccdemo-EFMIdntxcXmIwQab6BTeNg==/base.apk (offset 882000) (Config::CreateContext_(int, int)+1452)
07-08 23:47:52.495100 25404 25487 F example.iccdem: runtime.cc:558]   native: #15 pc 000000000027d07c  /data/app/com.example.iccdemo-EFMIdntxcXmIwQab6BTeNg==/base.apk (offset 882000) (dc_init+472)
07-08 23:47:52.495111 25404 25487 F example.iccdem: runtime.cc:558]   native: #16 pc 000000000006e3d8  /data/app/com.example.iccdemo-EFMIdntxcXmIwQab6BTeNg==/base.apk (offset 8d000) (Java_com_decard_NDKMethod_BasicOper_dc_1open+1868)
07-08 23:47:52.495121 25404 25487 F example.iccdem: runtime.cc:558]   native: #17 pc 00000000000c7eec  /dev/ashmem/dalvik-jit-code-cache (deleted) (com.decard.NDKMethod.BasicOper.dc_open+236)
07-08 23:47:52.495131 25404 25487 F example.iccdem: runtime.cc:558]   native: #18 pc 000000000001b3ec  /dev/ashmem/dalvik-jit-code-cache (deleted) (com.example.iccdemo.MainActivity$startQR$1.invokeSuspend+876)

2.4 art添加调试信息

diff --git a/art/runtime/indirect_reference_table.cc b/art/runtime/indirect_reference_table.cc
old mode 100644
new mode 100755
index 3b9cc0f..e50f7ab
--- a/art/runtime/indirect_reference_table.cc
+++ b/art/runtime/indirect_reference_table.cc
@@ -247,6 +247,10 @@ IndirectRef IndirectReferenceTable::Add(IRTSegmentState previous_state,
   }
  
   size_t top_index = segment_state_.top_index;
+  //system_server: +++ Add: malio possible leakage top_index=1292  #通过日志可以加速判断是否出现引用泄露问题
+  if(top_index > 2000){ //debug
+    LOG(INFO) << "+++ Add: malio possible leakage top_index=" << top_index;
+  }
  
   CHECK(obj != nullptr);
   VerifyObject(obj);
diff --git a/art/runtime/java_vm_ext.cc b/art/runtime/java_vm_ext.cc
old mode 100644
new mode 100755
index da4c4b2..58e88bc
--- a/art/runtime/java_vm_ext.cc
+++ b/art/runtime/java_vm_ext.cc
@@ -55,7 +55,7 @@ namespace art {
 using android::base::StringAppendF;
 using android::base::StringAppendV;
  
-static constexpr size_t kGlobalsMax = 51200;  // Arbitrary sanity check. (Must fit in 16 bits.)
+static constexpr size_t kGlobalsMax = 10000;  // Arbitrary sanity check. (Must fit in 16 bits.) #减少复现问题的压测次数
  
 static constexpr size_t kWeakGlobalsMax = 51200;  // Arbitrary sanity check. (Must fit in 16 bits.)

问题总结

1、基本确认是供应商扫码sdk的jni申请NewGlobalRef和释放全局引用DeleteGlobalRef逻辑存在缺陷,由于没有sdk源码,反馈给供应商分析。

2、核对后,发现供应商给的参考逻辑有一个创建全局引用的调用,却没有调用释放此引用的逻辑。注释无效的创建全局引用后压测正常。

参考:

JNI内存方面说明以及相关类型手动释放内存_jni 内存不释放-CSDN博客

Android稳定性系列9 global reference限制策略_irtsegmentstate-CSDN博客

JNI实现源码分析【三 间接引用表】_use of deleted global reference-CSDN博客

global reference table overflow-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值