java.lang.InternalError: Thread starting during runtime shutdown
来源:互联网 发布:dsm请检查网络设置 编辑:程序博客网 时间:2024/06/13 16:55
java.lang.InternalError: Thread starting during runtime shutdown
0x01. 堆栈信息
这里借用别人的堆栈信息,出错原因都是一样的.
Fatal Exception: java.lang.InternalError: Thread starting during runtime shutdown at java.lang.Thread.nativeCreate(Thread.java) at java.lang.Thread.start(Thread.java:1063) at org.apache.http.impl.conn.tsccm.AbstractConnPool.enableConnectionGC(AbstractConnPool.java:145) at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager.createConnectionPool(ThreadSafeClientConnManager.java:125) at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager.<init>(ThreadSafeClientConnManager.java:103) at org.acra.util.HttpRequest.getHttpClient(HttpRequest.java:214) at org.acra.util.HttpRequest.send(HttpRequest.java:141) at org.acra.sender.HttpSender.send(HttpSender.java:225) at org.acra.SendWorker.sendCrashReport(SendWorker.java:179) at org.acra.SendWorker.checkAndSendReports(SendWorker.java:141) at org.acra.SendWorker.run(SendWorker.java:77)
0x02. 源码
➜ android-7.0.0_r1 grep -rn 'Thread starting during runtime shutdown'* art/runtime/thread.cc:619: env->ThrowNew(error_class.get(), "Thread starting during runtime shutdown");
void Thread::CreateNativeThread(JNIEnv* env, jobject java_peer, size_t stack_size, bool is_daemon) { CHECK(java_peer != nullptr); Thread* self = static_cast<JNIEnvExt*>(env)->self; if (VLOG_IS_ON(threads)) { ScopedObjectAccess soa(env); ArtField* f = soa.DecodeField(WellKnownClasses::java_lang_Thread_name); mirror::String* java_name = reinterpret_cast<mirror::String*>(f->GetObject( soa.Decode<mirror::Object*>(java_peer))); std::string thread_name; if (java_name != nullptr) { thread_name = java_name->ToModifiedUtf8(); } else { thread_name = "(Unnamed)"; } VLOG(threads) << "Creating native thread for " << thread_name; self->Dump(LOG(INFO)); } Runtime* runtime = Runtime::Current(); // Atomically start the birth of the thread ensuring the runtime isn't shutting down. bool thread_start_during_shutdown = false; { MutexLock mu(self, *Locks::runtime_shutdown_lock_); if (runtime->IsShuttingDownLocked()) { thread_start_during_shutdown = true; } else { runtime->StartThreadBirth(); } } if (thread_start_during_shutdown) {//At there!!! ScopedLocalRef<jclass> error_class(env, env->FindClass("java/lang/InternalError")); env->ThrowNew(error_class.get(), "Thread starting during runtime shutdown"); return; } Thread* child_thread = new Thread(is_daemon); // Use global JNI ref to hold peer live while child thread starts. child_thread->tlsPtr_.jpeer = env->NewGlobalRef(java_peer); stack_size = FixStackSize(stack_size); // Thread.start is synchronized, so we know that nativePeer is 0, and know that we're not racing to // assign it. env->SetLongField(java_peer, WellKnownClasses::java_lang_Thread_nativePeer, reinterpret_cast<jlong>(child_thread)); // Try to allocate a JNIEnvExt for the thread. We do this here as we might be out of memory and // do not have a good way to report this on the child's side. std::unique_ptr<JNIEnvExt> child_jni_env_ext( JNIEnvExt::Create(child_thread, Runtime::Current()->GetJavaVM())); int pthread_create_result = 0; if (child_jni_env_ext.get() != nullptr) { pthread_t new_pthread; pthread_attr_t attr; child_thread->tlsPtr_.tmp_jni_env = child_jni_env_ext.get(); CHECK_PTHREAD_CALL(pthread_attr_init, (&attr), "new thread"); CHECK_PTHREAD_CALL(pthread_attr_setdetachstate, (&attr, PTHREAD_CREATE_DETACHED), "PTHREAD_CREATE_DETACHED"); CHECK_PTHREAD_CALL(pthread_attr_setstacksize, (&attr, stack_size), stack_size); pthread_create_result = pthread_create(&new_pthread, &attr, Thread::CreateCallback, child_thread); CHECK_PTHREAD_CALL(pthread_attr_destroy, (&attr), "new thread"); if (pthread_create_result == 0) { // pthread_create started the new thread. The child is now responsible for managing the // JNIEnvExt we created. // Note: we can't check for tmp_jni_env == nullptr, as that would require synchronization // between the threads. child_jni_env_ext.release(); return; } } // Either JNIEnvExt::Create or pthread_create(3) failed, so clean up. { MutexLock mu(self, *Locks::runtime_shutdown_lock_); runtime->EndThreadBirth(); } // Manually delete the global reference since Thread::Init will not have been run. env->DeleteGlobalRef(child_thread->tlsPtr_.jpeer); child_thread->tlsPtr_.jpeer = nullptr; delete child_thread; child_thread = nullptr; // TODO: remove from thread group? env->SetLongField(java_peer, WellKnownClasses::java_lang_Thread_nativePeer, 0); { std::string msg(child_jni_env_ext.get() == nullptr ? "Could not allocate JNI Env" : StringPrintf("pthread_create (%s stack) failed: %s", PrettySize(stack_size).c_str(), strerror(pthread_create_result))); ScopedObjectAccess soa(env); soa.Self()->ThrowOutOfMemoryError(msg.c_str()); }}
0x03. 分析
当ART Runtime已经shutdown的时候才开始启动线程,这个时候就抛出这个异常! 不科学啊!!
ART and Dalvik
Android runtime (ART) is the managed runtime used by applications and some system services on Android. ART and its predecessor Dalvik were originally created specifically for the Android project. ART as the runtime executes the Dalvik Executable format and Dex bytecode specification.
ART and Dalvik are compatible runtimes running Dex bytecode, so apps developed for Dalvik should work when running with ART. However, some techniques that work on Dalvik do not work on ART. For information about the most important issues, see Verifying App Behavior on the Android Runtime (ART).https://source.android.com/devices/tech/dalvik/
- java.lang.InternalError: Thread starting during runtime shutdown
- java.lang.InternalError: Thread starting during runtime shutdown
- Thread starting during runtime shutdown问题的解决
- java.lang.InternalError翻译
- Exception in thread "main" java.lang.InternalError: Can't connect to X11 window
- Android 混淆之后出现java.lang.InternalError
- sqoop 报错之java.lang.InternalError
- Exception in thread "AWT-Shutdown" java.lang.OutOfMemoryError: PermGen space
- 解决在6.0系统出现java.lang.InternalError
- java.lang.InternalError: internal error: SHA-1 not available.
- java.lang.InternalError: internal error: SHA-1 not available
- Starting elasticsearch: Exception in thread "main" java.lang.IllegalStateException: Could not load p
- java.lang.Runtime
- java.lang.Runtime
- java.lang.Runtime类
- java.lang.Runtime类
- 09 java.lang.Runtime
- java.lang.Runtime类
- Java构造方法和成员方法
- 灰度增强和去噪
- HDU 3001 Traveling
- android热门依赖
- 静态方法和非静态方法
- java.lang.InternalError: Thread starting during runtime shutdown
- 使用Spring Boot开发Web项目
- pandas中字符串和日期的相互转换
- 40. Combination Sum II
- 直接打开XILINX SDK工程
- 反思
- 递归
- opencv——canny算子提取图像边缘
- Hadoop Hbase 分布式部署