system_server에서 교착 상태가 발생했으며 잠금은 PackageManager에 의해 보류됩니다. GC가 차단되면 다른 JNI가 GetStringCritical 및 ReleaseStringCritical의 사이에 호출이있는 경우 GetStringCritical 원인이 교착 상태가 될 수 있습니까?
"PackageManager" prio=5 tid=27 WaitingForGcToComplete
| group="main" sCount=1 dsCount=0 obj=0x12d3e7b0 self=0xb865c1a0
| sysTid=579 nice=0 cgrp=default sched=0/0 handle=0xb865c788
| state=S schedstat=(82300981 68593861 146) utm=6 stm=2 core=1 HZ=100
| stack=0xa0fdb000-0xa0fdd000 stackSize=1036KB
| held mutexes=
native: #00 pc 00012960 /system/lib/libc.so (syscall+28)
native: #01 pc 000a88ad /system/lib/libart.so(art::Mutex::ExclusiveLock(art::Thread*)+364)
native: #02 pc 0013aa7b /system/lib/libart.so (art::gc::Heap::IncrementDisableMovingGC(art::Thread*)+90)
native: #03 pc 001c0329 /system/lib/libart.so (art::JNI::GetStringCritical(_JNIEnv*, _jstring*, unsigned char*)+392)
native: #04 pc 00082223 /system/lib/libandroid_runtime.so (???)
native: #05 pc 00082291 /system/lib/libandroid_runtime.so (???)
native: #06 pc 00263595 /data/dalvik-cache/arm/[email protected]@boot.oat (Java_android_os_Parcel_nativeWriteString__JLjava_lang_String_2+120)
at android.os.Parcel.nativeWriteString(Native method)
at android.os.Parcel.writeString(Parcel.java:542)
at android.content.ComponentName.writeToParcel(ComponentName.java:267)
at android.content.ComponentName.writeToParcel(ComponentName.java:282)
at android.content.Intent.writeToParcel(Intent.java:7486)
at android.app.ApplicationThreadProxy.scheduleUnbindService(ApplicationThreadNative.java:929)
at com.android.server.am.ActiveServices.removeConnectionLocked(ActiveServices.java:1842)
at com.android.server.am.ActiveServices.unbindServiceLocked(ActiveServices.java:943)
at com.android.server.am.ActivityManagerService.unbindService(ActivityManagerService.java:15787)
- locked <0x1d3e13e9> (a com.android.server.am.ActivityManagerService)
그래서 내가 그것을 구글과 발견, 교착 상태가 발생할 수 있습니다. 자세한 내용을 보려면
The Java Native Interface: Programmer's Guide and Specification
이것은 frameworks \ base \ core \ jni \ android_os_Parcel.cpp의 android_os_Parcel_writeString 메소드의 일부입니다.
const jchar* str = env->GetStringCritical(val, 0);
if (str) {
err = parcel->writeString16(str, env->GetStringLength(val));
env->ReleaseStringCritical(val, str);
}
나는 android_os_Parcel_writeString은 매우 일반적으로 사용되는 방법이기 때문에 교착 상태가 android_os_Parcel_writeString에 의해 원인이 확실 할 수 없습니다.
그래서 android_os_Parcel_writeString이 교착 상태를 유발할 수 있습니다.
답장을 보내 주셔서 감사 드리며 어색한 영어를 잊어 버리십시오.