成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

OpenJDK9 Hotspot : Thread

roundstones / 1810人閱讀

摘要:前言本文從類的方法的內(nèi)部實(shí)現(xiàn)入手,分析多線程相關(guān)的數(shù)據(jù)結(jié)構(gòu)類和原理類方法類的方法用于啟動(dòng)線程,方法內(nèi)部調(diào)用了方法在源代碼中搜索,可以看到對(duì)應(yīng)函數(shù)在源代碼中搜索函數(shù)核心代碼計(jì)算線程堆棧大小創(chuàng)建對(duì)象初始化啟動(dòng)線程在創(chuàng)建時(shí)傳入了一個(gè)函數(shù)指針,

前言

本文從 Java Thread 類的 start 方法的內(nèi)部實(shí)現(xiàn)入手,分析 Hotspot JVM 多線程相關(guān)的數(shù)據(jù)結(jié)構(gòu)(類)和原理

Thread 類 start 方法

Thread 類的 start 方法用于啟動(dòng)線程,方法內(nèi)部調(diào)用了 native 方法 start0

public synchronized void start() {
    ...
    try {
        start0();
        started = true;
    } finally {
    ...}
}

private native void start0();

在 openjdk 源代碼中搜索 start0,可以看到 start0 對(duì)應(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

計(jì)算 線程堆棧 大小

創(chuàng)建 JavaThread 對(duì)象

初始化 osthread ?

啟動(dòng)線程

在創(chuàng)建 JavaThread 時(shí)傳入了一個(gè)函數(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 對(duì)象的 run 方法,將控制邏輯從 native 環(huán)境轉(zhuǎn)向 Java 環(huán)境

JavaThread

從上文分析 Java Thread 類的 start 方法可以得知 每個(gè) Java Threard 對(duì)象在 JVM 內(nèi)部都有一個(gè) native 對(duì)象 JavaThread 與之對(duì)應(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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66705.html

相關(guān)文章

  • OpenJDK9 Hotspot:Zero 解釋器 初探

    摘要:準(zhǔn)備工作假設(shè)源代碼目錄為編譯時(shí)啟用了解釋器參考編譯和調(diào)試調(diào)用棧先在函數(shù)參考虛擬機(jī)入口中設(shè)斷點(diǎn),然后在的方法中設(shè)置斷點(diǎn)通過(guò)宏獲取當(dāng)前,然后創(chuàng)建第個(gè)棧幀,然后進(jìn)入解釋執(zhí)行字節(jié)碼 準(zhǔn)備工作 假設(shè) openjdk 源代碼目錄為 jdk9dev 編譯 openjdk 時(shí)啟用了 zero 解釋器(參考 OpenJDK9 Hotspot Mac OSX 編譯和調(diào)試) 調(diào)用棧 先在 JavaMai...

    zhangqh 評(píng)論0 收藏0
  • OpenJDK9 Hotspot : Object wait/notify 方法淺析

    摘要:前言方法是早期提供的一種基于的線程同步方法,本文先介紹相關(guān)的數(shù)據(jù)結(jié)構(gòu)類,然后從方法的內(nèi)部實(shí)現(xiàn)入手,簡(jiǎn)單分析相關(guān)的原理和實(shí)現(xiàn)類用于實(shí)現(xiàn)的定待和喚醒,不同平臺(tái)操作系統(tǒng)平臺(tái)對(duì)應(yīng)的定義在文件類的分配和釋放使用了對(duì)象緩存,靜態(tài)字段用于緩存當(dāng)前 前言 Object wait/notify 方法是早期 JVM 提供的一種基于 Object Monitor 的線程同步方法,本文先介紹相關(guān)的數(shù)據(jù)結(jié)構(gòu)(類...

    fancyLuo 評(píng)論0 收藏0
  • OpenJDK9 Hotspot 虛擬機(jī)內(nèi)部對(duì)象內(nèi)存管理

    摘要:前言語(yǔ)言可以精確控制對(duì)象內(nèi)存分配,出于性能考慮框架系統(tǒng)程序基本都會(huì)自己造輪子開(kāi)發(fā)各種內(nèi)存管理模塊也不例外,它通過(guò)和方法的訪問(wèn)級(jí)別以及重載和方法來(lái)管理虛擬機(jī)內(nèi)部對(duì)象的內(nèi)存內(nèi)存管理相關(guān)的基類定義了幾個(gè)基類來(lái)作為大部分對(duì)象的基類顧名思義,它們只能 前言 C++ 語(yǔ)言可以精確控制對(duì)象內(nèi)存分配,出于性能考慮 C++ 框架 or 系統(tǒng)程序基本都會(huì)自己 造輪子 開(kāi)發(fā)各種內(nèi)存管理模塊. hotspot...

    W_BinaryTree 評(píng)論0 收藏0
  • OpenJDK9 Hotspot : synchronized 淺析

    摘要:前言網(wǎng)上各路大神總結(jié)過(guò)各種關(guān)于內(nèi)部實(shí)現(xiàn),看別人的文章總覺(jué)得不過(guò)癮,所以有了這篇文章,嘗試再扒一次的底褲數(shù)據(jù)結(jié)構(gòu)在分析源代碼之前需要了解相關(guān)概念,比如等,參考網(wǎng)絡(luò)上各種解說(shuō)或者之前系列文章,這里重點(diǎn)介紹一下,,每個(gè)在內(nèi)部都有一個(gè)的對(duì)象與之對(duì)應(yīng) 前言 網(wǎng)上各路大神總結(jié)過(guò)各種關(guān)于 hotspot jvm synchronized 內(nèi)部實(shí)現(xiàn),看別人的文章總覺(jué)得不過(guò)癮,所以有了這篇文章,嘗試再扒...

    Amio 評(píng)論0 收藏0
  • OpenJDK9 Hotspot Mac OSX 編譯和調(diào)試

    摘要:占用率太高,還出各種奇怪問(wèn)題,轉(zhuǎn)投調(diào)試安裝下載源代碼漫長(zhǎng)等待,中間無(wú)數(shù)次中斷安裝安裝可選如果要使用解釋器,需要安裝設(shè)置調(diào)試級(jí)別,設(shè)成可以提供更多的調(diào)試信息設(shè)置路徑 Intellij CLion CPU 占用率太高,還出各種奇怪問(wèn)題,轉(zhuǎn)投 Xcode 調(diào)試 hotspot 安裝 hg # brew install hg 下載 open jdk 9 源代碼 # hg clone http...

    zhichangterry 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<