摘要:前言本文從類的方法的內(nèi)部實現(xiàn)入手,分析多線程相關的數(shù)據(jù)結構類和原理類方法類的方法用于啟動線程,方法內(nèi)部調(diào)用了方法在源代碼中搜索,可以看到對應函數(shù)在源代碼中搜索函數(shù)核心代碼計算線程堆棧大小創(chuàng)建對象初始化啟動線程在創(chuàng)建時傳入了一個函數(shù)指針,
前言
本文從 Java Thread 類的 start 方法的內(nèi)部實現(xiàn)入手,分析 Hotspot JVM 多線程相關的數(shù)據(jù)結構(類)和原理
Thread 類 start 方法Thread 類的 start 方法用于啟動線程,方法內(nèi)部調(diào)用了 native 方法 start0
public synchronized void start() { ... try { start0(); started = true; } finally { ...} } private native void start0();
在 openjdk 源代碼中搜索 start0,可以看到 start0 對應 JVM_StartThread native 函數(shù)
jdk/src/java.base/share/native/libjava/Thread.c:44: {"start0", "()V", (void *)&JVM_StartThread},
在 openjdk 源代碼中搜索 JVM_StartThread
hotspot/src/share/vm/prims/jvm.cpp:2785: JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))
JVM_StartThread 函數(shù)核心代碼
JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread)) { JVMWrapper("JVM_StartThread"); JavaThread *native_thread = NULL; ... JavaThread *native_thread; ... if (...) { } else { jlong size = janga_lang_Thread::stackSize( JNIHandles::resolve_non_null(jthread)); size_t sz = size > 0 ? (size_t) size : 0; native_thread = new JavaThread(&thread_entry, sz); if (native_thread->osthread() != NULL) { native_thread->prepare(jthread); } } ... Thread::start(native_thread); } JVM_END
計算 線程堆棧 大小
創(chuàng)建 JavaThread 對象
初始化 osthread ?
啟動線程
在創(chuàng)建 JavaThread 時傳入了一個函數(shù)指針 thread_entry,它是 os thread 的入口函數(shù)
static void thread_entry(JavaThread* thread, TRAPS) { HandleMark hm(THREAD); Handle obj(THREAD, thread->threadObj()); JavaValue result(T_VOID); JavaCalls::call_virtual(&result, obj, KlassHandle(THREAD, SystemDictionary::Thread_klass()), vmSymbols::run_method_name(), vmSymbols::void_method_signature(), THREAD); }
JavaCalls::call_virtual 函數(shù)用于從 native(C/C++)代碼調(diào)用 Java 代碼,從變量和函數(shù)命名很容易看出,thread_entry 函數(shù)將調(diào)用 Java Thread 對象的 run 方法,將控制邏輯從 native 環(huán)境轉向 Java 環(huán)境
JavaThread從上文分析 Java Thread 類的 start 方法可以得知 每個 Java Threard 對象在 JVM 內(nèi)部都有一個 native 對象 JavaThread 與之對應. 我們從構造函數(shù)入手分析 JavaThread. thread.cpp 文件中有一段注釋描述了 Hotspot 線程類的層次結構:
Class hierarchy - Thread - NamedThread - VMThread - ConcurrentGCThread - WorkerThread - GangWorker - GCTaskThread - JavaThread - various subclasses eg CompilerThread, ServiceThread - WatcherThread構造函數(shù)
JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz) : Thread() { initialize(); _jni_attach_state = _not_attaching_via_jni; set_entry_point(entry_point); // Create the native thread itself. // %note runtime_23 os::ThreadType thr_type = os::java_thread; thr_type = entry_point == &compiler_thread_entry ? os::compiler_thread : os::java_thread; os::create_thread(this, thr_type, stack_sz); }
根據(jù) entry_point(線程入口函數(shù)指針)確定線程線程 thr_type
調(diào)用 os::create_thread 創(chuàng)建 os thread(pthread)
OSThread 總結文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/66705.html
摘要:準備工作假設源代碼目錄為編譯時啟用了解釋器參考編譯和調(diào)試調(diào)用棧先在函數(shù)參考虛擬機入口中設斷點,然后在的方法中設置斷點通過宏獲取當前,然后創(chuàng)建第個棧幀,然后進入解釋執(zhí)行字節(jié)碼 準備工作 假設 openjdk 源代碼目錄為 jdk9dev 編譯 openjdk 時啟用了 zero 解釋器(參考 OpenJDK9 Hotspot Mac OSX 編譯和調(diào)試) 調(diào)用棧 先在 JavaMai...
摘要:前言方法是早期提供的一種基于的線程同步方法,本文先介紹相關的數(shù)據(jù)結構類,然后從方法的內(nèi)部實現(xiàn)入手,簡單分析相關的原理和實現(xiàn)類用于實現(xiàn)的定待和喚醒,不同平臺操作系統(tǒng)平臺對應的定義在文件類的分配和釋放使用了對象緩存,靜態(tài)字段用于緩存當前 前言 Object wait/notify 方法是早期 JVM 提供的一種基于 Object Monitor 的線程同步方法,本文先介紹相關的數(shù)據(jù)結構(類...
摘要:前言語言可以精確控制對象內(nèi)存分配,出于性能考慮框架系統(tǒng)程序基本都會自己造輪子開發(fā)各種內(nèi)存管理模塊也不例外,它通過和方法的訪問級別以及重載和方法來管理虛擬機內(nèi)部對象的內(nèi)存內(nèi)存管理相關的基類定義了幾個基類來作為大部分對象的基類顧名思義,它們只能 前言 C++ 語言可以精確控制對象內(nèi)存分配,出于性能考慮 C++ 框架 or 系統(tǒng)程序基本都會自己 造輪子 開發(fā)各種內(nèi)存管理模塊. hotspot...
摘要:前言網(wǎng)上各路大神總結過各種關于內(nèi)部實現(xiàn),看別人的文章總覺得不過癮,所以有了這篇文章,嘗試再扒一次的底褲數(shù)據(jù)結構在分析源代碼之前需要了解相關概念,比如等,參考網(wǎng)絡上各種解說或者之前系列文章,這里重點介紹一下,,每個在內(nèi)部都有一個的對象與之對應 前言 網(wǎng)上各路大神總結過各種關于 hotspot jvm synchronized 內(nèi)部實現(xiàn),看別人的文章總覺得不過癮,所以有了這篇文章,嘗試再扒...
摘要:占用率太高,還出各種奇怪問題,轉投調(diào)試安裝下載源代碼漫長等待,中間無數(shù)次中斷安裝安裝可選如果要使用解釋器,需要安裝設置調(diào)試級別,設成可以提供更多的調(diào)試信息設置路徑 Intellij CLion CPU 占用率太高,還出各種奇怪問題,轉投 Xcode 調(diào)試 hotspot 安裝 hg # brew install hg 下載 open jdk 9 源代碼 # hg clone http...
閱讀 2984·2021-11-16 11:45
閱讀 1728·2021-09-26 10:19
閱讀 2119·2021-09-13 10:28
閱讀 2897·2021-09-08 10:46
閱讀 1758·2021-09-07 10:13
閱讀 1597·2019-08-30 13:50
閱讀 1468·2019-08-30 11:17
閱讀 1525·2019-08-29 13:18