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