日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

聊聊JVM(五)从JVM角度理解线程

發布時間:2024/1/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 聊聊JVM(五)从JVM角度理解线程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

?

我們知道JVM主要是用C++實現的,JVM定義的Thread的類繼承結構如下:

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

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

?

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

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

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

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

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

?

有兩種方式可以讓用戶在JVM中創建線程

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

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

?

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

1. 創建對應的JavaThread的instance

2. 創建對應的OSThread的instance

3. 創建實際的底層操作系統的native thread

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

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

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

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

?

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

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

2. JVM創建相應的JavaThread和OSThread對象

3. 創建相應的java.lang.Thread的對象

4. 一旦java.lang.Thread的Object創建之后,JNI就可以調用Java代碼了

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

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

?

從JVM的角度來看待線程狀態的狀態有以下幾種:

其中主要的狀態是這5種:

_thread_new: 新創建的線程

_thread_in_Java: 在運行Java代碼

_thread_in_vm: 在運行JVM本身的代碼

_thread_in_native: 在運行native代碼

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

?

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

比較常見有:

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

MONITOR_WAIT: 等待鎖

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

SLEEPING: 執行了Thread.sleep()的

?

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

?

最后來看一下JVM內部的VM Threads,主要由幾類:

VMThread: 執行JVM本身的操作

Periodic task thread: JVM內部執行定時任務的線程

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

Compiler threads: JIT用來動態編譯的線程

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

?

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

?

參考:??Hotspot JVM thread management

總結

以上是生活随笔為你收集整理的聊聊JVM(五)从JVM角度理解线程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。