久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

聊聊JVM(五)從JVM角度理解線程

 WindySky 2017-10-25 發(fā)布于廣東

這篇說說如何從JVM的角度來理解線程,,可以對Java的線程模型有一個更加深入的理解,對GC的一些細節(jié)也會理解地更加深刻,。本文基于HotSpot的OpenJDK7實現(xiàn),。


我們知道JVM主要是用C++實現(xiàn)的,JVM定義的Thread的類繼承結(jié)構如下:

Class hierarchy
 - Thread
   - NamedThread
     - VMThread
     - ConcurrentGCThread
     - WorkerThread
       - GangWorker
       - GCTaskThread
   - JavaThread
   - WatcherThread

另外還有一個重要的類OSThread不在這個繼承關系里,,它以組合的方式被Thread類所使用


這些類構成了JVM的線程模型,,其中最主要的是下面幾個類:

java.lang.Thread: 這個是Java語言里的線程類,由這個Java類創(chuàng)建的instance都會 1:1 映射到一個操作系統(tǒng)的osthread

JavaThread: JVM中C++定義的類,,一個JavaThread的instance代表了在JVM中的java.lang.Thread的instance, 它維護了線程的狀態(tài),并且維護一個指針指向java.lang.Thread創(chuàng)建的對象(oop),。它同時還維護了一個指針指向?qū)腛SThread,,來獲取底層操作系統(tǒng)創(chuàng)建的osthread的狀態(tài)

OSThread: JVM中C++定義的類,代表了JVM中對底層操作系統(tǒng)的osthread的抽象,,它維護著實際操作系統(tǒng)創(chuàng)建的線程句柄handle,,可以獲取底層osthread的狀態(tài)

VMThread: JVM中C++定義的類,這個類和用戶創(chuàng)建的線程無關,,是JVM本身用來進行虛擬機操作的線程,,比如GC。


有兩種方式可以讓用戶在JVM中創(chuàng)建線程

1. new java.lang.Thread().start()

2. 使用JNI將一個native thread attach到JVM中


針對 new java.lang.Thread().start()這種方式,,只有調(diào)用start()方法的時候,,才會真正的在JVM中去創(chuàng)建線程,主要的生命周期步驟有:

1. 創(chuàng)建對應的JavaThread的instance

2. 創(chuàng)建對應的OSThread的instance

3. 創(chuàng)建實際的底層操作系統(tǒng)的native thread

4. 準備相應的JVM狀態(tài),,比如ThreadLocal存儲空間分配等

5. 底層的native thread開始運行,,調(diào)用java.lang.Thread生成的Object的run()方法

6. 當java.lang.Thread生成的Object的run()方法執(zhí)行完畢返回后,或者拋出異常終止后,,終止native thread

7. 釋放JVM相關的thread的資源,清除對應的JavaThread和OSThread


針對JNI將一個native thread attach到JVM中,,主要的步驟有:

1. 通過JNI call AttachCurrentThread申請連接到執(zhí)行的JVM實例

2. JVM創(chuàng)建相應的JavaThread和OSThread對象

3. 創(chuàng)建相應的java.lang.Thread的對象

4. 一旦java.lang.Thread的Object創(chuàng)建之后,,JNI就可以調(diào)用Java代碼了

5. 當通過JNI call DetachCurrentThread之后,JNI就從JVM實例中斷開連接

6. JVM清除相應的JavaThread, OSThread, java.lang.Thread對象


從JVM的角度來看待線程狀態(tài)的狀態(tài)有以下幾種:


其中主要的狀態(tài)是這5種:

_thread_new: 新創(chuàng)建的線程

_thread_in_Java: 在運行Java代碼

_thread_in_vm: 在運行JVM本身的代碼

_thread_in_native: 在運行native代碼

_thread_blocked: 線程被阻塞了,,包括等待一個鎖,,等待一個條件,sleep,,執(zhí)行一個阻塞的IO等


從OSThread的角度,,JVM還定義了一些線程狀態(tài)給外部使用,比如用jstack輸出的線程堆棧信息中線程的狀態(tài):

比較常見有:

Runnable: 可以運行或者正在運行的

MONITOR_WAIT: 等待鎖

OBJECT_WAIT: 執(zhí)行了Object.wait()之后在條件隊列中等待的

SLEEPING: 執(zhí)行了Thread.sleep()的


從JavaThread的角度,,JVM定義了一些針對Java Thread對象的狀態(tài),,基本類似,多了一個TIMED_WAITING的狀態(tài),,用來表示定時阻塞的狀態(tài)



最后來看一下JVM內(nèi)部的VM Threads,,主要由幾類:

VMThread: 執(zhí)行JVM本身的操作

Periodic task thread: JVM內(nèi)部執(zhí)行定時任務的線程

GC threads: GC相關的線程,比如單線程/多線程的GC收集器使用的線程

Compiler threads: JIT用來動態(tài)編譯的線程

Signal dispatcher thread: Java解釋器Interceptor用來輔助safepoint操作的線程


具體的VMThread的作用,,會在講safepoint的時候細說,,就寫到這里吧


參考:  Hotspot JVM thread management


    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多