摘要:前言本文從類的方法的內(nèi)部實現(xiàn)入手,分析多線程相關(guān)的數(shù)據(jù)結(jié)構(gòu)類和原理類方法類的方法用于啟動線程,方法內(nèi)部調(diào)用了方法在源代碼中搜索,可以看到對應(yīng)函數(shù)在源代碼中搜索函數(shù)核心代碼計算線程堆棧大小創(chuàng)建對象初始化啟動線程在創(chuàng)建時傳入了一個函數(shù)指針,
前言
本文從 Java Thread 類的 start 方法的內(nèi)部實現(xiàn)入手,分析 Hotspot JVM 多線程相關(guān)的數(shù)據(jù)結(jié)構(gòu)(類)和原理
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 對應(yīng) 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)境轉(zhuǎn)向 Java 環(huán)境
JavaThread從上文分析 Java Thread 類的 start 方法可以得知 每個 Java Threard 對象在 JVM 內(nèi)部都有一個 native 對象 JavaThread 與之對應(yīng). 我們從構(gòu)造函數(shù)入手分析 JavaThread. thread.cpp 文件中有一段注釋描述了 Hotspot 線程類的層次結(jié)構(gòu):
Class hierarchy - Thread - NamedThread - VMThread - ConcurrentGCThread - WorkerThread - GangWorker - GCTaskThread - JavaThread - various subclasses eg CompilerThread, ServiceThread - WatcherThread構(gòu)造函數(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 總結(jié)文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/66705.html
摘要:準(zhǔn)備工作假設(shè)源代碼目錄為編譯時啟用了解釋器參考編譯和調(diào)試調(diào)用棧先在函數(shù)參考虛擬機(jī)入口中設(shè)斷點,然后在的方法中設(shè)置斷點通過宏獲取當(dāng)前,然后創(chuàng)建第個棧幀,然后進(jìn)入解釋執(zhí)行字節(jié)碼 準(zhǔn)備工作 假設(shè) openjdk 源代碼目錄為 jdk9dev 編譯 openjdk 時啟用了 zero 解釋器(參考 OpenJDK9 Hotspot Mac OSX 編譯和調(diào)試) 調(diào)用棧 先在 JavaMai...
摘要:前言方法是早期提供的一種基于的線程同步方法,本文先介紹相關(guān)的數(shù)據(jù)結(jié)構(gòu)類,然后從方法的內(nèi)部實現(xiàn)入手,簡單分析相關(guān)的原理和實現(xiàn)類用于實現(xiàn)的定待和喚醒,不同平臺操作系統(tǒng)平臺對應(yīng)的定義在文件類的分配和釋放使用了對象緩存,靜態(tài)字段用于緩存當(dāng)前 前言 Object wait/notify 方法是早期 JVM 提供的一種基于 Object Monitor 的線程同步方法,本文先介紹相關(guān)的數(shù)據(jù)結(jié)構(gòu)(類...
摘要:前言語言可以精確控制對象內(nèi)存分配,出于性能考慮框架系統(tǒng)程序基本都會自己造輪子開發(fā)各種內(nèi)存管理模塊也不例外,它通過和方法的訪問級別以及重載和方法來管理虛擬機(jī)內(nèi)部對象的內(nèi)存內(nèi)存管理相關(guān)的基類定義了幾個基類來作為大部分對象的基類顧名思義,它們只能 前言 C++ 語言可以精確控制對象內(nèi)存分配,出于性能考慮 C++ 框架 or 系統(tǒng)程序基本都會自己 造輪子 開發(fā)各種內(nèi)存管理模塊. hotspot...
摘要:前言網(wǎng)上各路大神總結(jié)過各種關(guān)于內(nèi)部實現(xiàn),看別人的文章總覺得不過癮,所以有了這篇文章,嘗試再扒一次的底褲數(shù)據(jù)結(jié)構(gòu)在分析源代碼之前需要了解相關(guān)概念,比如等,參考網(wǎng)絡(luò)上各種解說或者之前系列文章,這里重點介紹一下,,每個在內(nèi)部都有一個的對象與之對應(yīng) 前言 網(wǎng)上各路大神總結(jié)過各種關(guān)于 hotspot jvm synchronized 內(nèi)部實現(xiàn),看別人的文章總覺得不過癮,所以有了這篇文章,嘗試再扒...
摘要:占用率太高,還出各種奇怪問題,轉(zhuǎn)投調(diào)試安裝下載源代碼漫長等待,中間無數(shù)次中斷安裝安裝可選如果要使用解釋器,需要安裝設(shè)置調(diào)試級別,設(shè)成可以提供更多的調(diào)試信息設(shè)置路徑 Intellij CLion CPU 占用率太高,還出各種奇怪問題,轉(zhuǎn)投 Xcode 調(diào)試 hotspot 安裝 hg # brew install hg 下載 open jdk 9 源代碼 # hg clone http...
閱讀 2746·2021-11-16 11:45
閱讀 1654·2021-09-26 10:19
閱讀 2051·2021-09-13 10:28
閱讀 2803·2021-09-08 10:46
閱讀 1530·2021-09-07 10:13
閱讀 1525·2019-08-30 13:50
閱讀 1374·2019-08-30 11:17
閱讀 1455·2019-08-29 13:18