遇到问题
项目使用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博客