導航:首頁 > 源碼編譯 > hotspot源碼分析視頻

hotspot源碼分析視頻

發布時間:2023-09-24 07:54:26

『壹』 HotSpot實戰的作品目錄

第1章初識HotSpot
1.1JDK概述
1.1.1JCP與JSR
1.1.2JDK的發展歷程
1.1.3java 7的語法變化
1.2動手編譯虛擬機
1.2.1源代碼下載
1.2.2HotSpot源代碼結構
1.2.3搭建編譯環境
1.2.4編譯目標
1.2.5編譯過程
1.2.6編譯常見問題
1.3實戰:在HotSpot內調試HelloWorld
1.3.1認識GDB
1.3.2准備調試腳本
1.4小結
第2章啟動
2.1HotSpot內核
2.1.1如何閱讀源代碼
2.1.2HotSpot內核框架
2.1.3Prims
2.1.4Services
2.1.5Runtime
2.2啟動
2.2.1Launcher
2.2.2虛擬機生命周期
2.2.3入口:main函數
2.2.4主線程
2.2.5InitializeJVM函數
2.2.6JNI_CreateJavaVM函數
2.2.7調用Java主方法
2.2.8JVM退出路徑
2.3系統初始化
2.3.1配置OS模塊
2.3.2配置系統屬性
2.3.3載入系統庫
2.3.4啟動線程
2.3.5vm_init_globals函數:初始化全局數據結構
2.3.6init_globals函數:初始化全局模塊
2.4小結
第3章類與對象
3.1對象表示機制
3.1.1OOP-Klass二分模型
3.1.2Oops模塊
3.1.3OOP框架與對象訪問機制
3.1.4Klass與instanceKlass
3.1.5實戰:用HSDB調試HotSpot
3.2類的狀態轉換
3.2.1入口:Class文件
3.2.2類的狀態
3.2.3載入
3.2.4鏈接
3.2.5初始化
3.2.6實戰:類的「族譜」
3.2.7實戰:系統字典
3.3創建對象
3.3.1實例對象的創建流程
3.3.2實戰:探測JVM內部對象
3.4小結
第4章運行時數據區
4.1堆
4.1.1Java的自動內存管理
4.1.2堆的管理
4.2線程私有區域
4.2.1PC
4.2.2JVM棧
4.3方法區
4.3.1紐帶作用
4.3.2常量池
4.3.3常量池緩存:ConstantPoolCache
4.3.4方法的表示:methodOop
4.3.5方法的解析:將符號引用轉換成直接引用
4.3.6代碼放在哪裡:ConstMethodOop
4.3.7實戰:探測運行時常量池
4.4性能監控數據區:Perf Data
4.4.1描述這段空間:PerfMemory
4.4.2 查看
4.4.3 生產
4.5 轉儲
4.5.1 用VisualVM進行轉儲分析
4.5.2 JVM Crash
4.6 小結
第5章 垃圾收集
5.1 堆與GC
5.1.1 垃圾收集
5.1.2 分代收集
5.1.3 快速分配
5.1.4 棧上分配和逸出分析
5.1.5 GC公共模塊
5.2 垃圾收集器
5.2.1 設計演進
5.2.2 CMS收集器
5.2.3 G1收集器
5.3 實戰:性能分析方法
5.3.1 獲取GC日誌
5.3.2 GC監控信息
5.3.3 內存分析工具
5.3.4 選擇合適的收集器與GC性能評估
5.3.5 不要忽略JVM Crash日誌
5.4 小結
第6章 棧
6.1 硬體背景:了解真實機器
6.1.1 程序是如何運行的
6.1.2 x86與棧幀
6.1.3 ARM對Java硬體級加速:Jazelle技術
6.2 Java棧
6.2.1 寄存器式指令集與棧式指令集
6.2.2 HotSpot中的棧
6.2.3 棧幀
6.2.4 充分利用寄存器資源
6.2.5 虛擬機如何調用Java函數
6.2.6 優化:棧頂緩存
6.2.7 實戰:操作數棧
6.3 小結
第7章 解釋器和即時編譯器
7.1 概述
7.2 解釋器如何工作
7.2.1 Interpreter模塊
7.2.2 Code模塊
7.2.3 位元組碼表
7.2.4 Code Cache
7.2.5 InterpreterCodelet與Stubs隊列
7.2.6 Code生成器
7.2.7 模板表與轉發表
7.2.8 實戰:InterpreterCodelet
7.3 即時編譯器
7.3.1 概述
7.3.2 編譯器模塊
7.3.3 編譯器的基本結構
7.3.4 實戰:編譯原理實踐,了解編譯中間環節
7.4 小結
第8章 指令集
8.1 再說棧式指令集
8.2 數據傳送
8.2.1 局部變數、常量池和操作數棧之間的數據傳送
8.2.2 數據傳送指令
8.2.4 實戰:數組的越界檢查
8.3 類型轉換
8.4 對象的創建和操作
8.5 程序流程式控制制
8.5.1 控制轉移指令
8.5.2 條件轉移
8.5.3 無條件轉移
8.5.4 復合條件轉移
8.5.5 實戰:switch語句如何使用String
8.6 運算
8.6.1 加法:iadd
8.6.2 取負:ineg
8.7 函數的調用和返回
8.7.1 Java函數分發機制:VTABLE與ITABLE
8.7.2 invoke系列指令
8.7.3 動態分發:覆蓋
8.7.4 靜態分發:重載
8.8 異常
8.8.1 異常表
8.8.2 創建異常
8.8.3 try-catch
8.8.4 finally
8.9 小結
第9章 虛擬機監控工具
9.1 Attach機制
9.1.1 AttachProvider與VirtualMachine
9.1.2 命令的下發:execute()
9.1.3 命令的執行:Attach Listener守護線程
9.2 查看JVM進程
9.2.1 用jps查看Java進程
9.2.2 實戰:定製jps,允許查看庫路徑
9.3 查看和配置JVM
9.3.1 用jinfo查看JVM參數配置
9.3.2 實戰:擴展flags選項,允許查看命令行參數
9.4 堆內存轉儲工具
9.4.1 Heap Dump
9.4.2 原理
9.5 堆轉儲分析
9.5.1 Heap Dump分析工具:jhat
9.5.2 實戰:MAT分析過程
9.6 線程轉儲分析
9.6.1 jstack
9.6.2 實戰:如何分析資源等待
9.7 小結

『貳』 JVM-安全點

Total time for which application threads were stop 超級長時間,這行日誌代表什麼,以及為什麼時間會這么長

當GC發生時,每個線程只有進入了SafePoint才算是真正掛起,也就是真正的停頓,這個日誌的含義是整個GC過程中STW的時間,配置了 -XX:+PrintGCApplicationStoppedTime 這個參數才會列印這個信息。

重點: 第一個 2.81 seconds 是JVM啟動後的秒數,第二個 2.6 seconds 是 JVM發起STW的開始到結束的時間。特別地,如果是GC引發的STW,這條內容會緊挨著出現在GC log的下面。

有關安全點的詳細說明,請移步:
JVM源碼分析之安全點safepoint
[Java JVM] Hotspot GC研究- GC安全點 (Safepoint&Stop The World)

等待所有用戶線程進入安全點後並阻塞,做一些全局性操作的行為。

配置 -XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1 參數,虛擬機會列印如下日誌文件:

RevokeBias、BulkRevokeBias、偏向鎖取消情況。
Deoptimize、
G1IncCollectionPause GC GC 執行情況。

分析 -XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1 產生的日誌信息基本上STW的原因都是RevokeBias或者BulkRevokeBias。這個是撤銷偏向鎖操作,雖然每次暫停的 時間很短,但是特別頻繁出現也會很耗時。

一些高並發的系統中,禁掉JVM偏向鎖優化,可以提升系統的吞吐量 。禁用偏向鎖的參數為: -XX:-UseBiasedLocking

R大分析類似情況
調優建議
各種JVM參數說明
stw分析
R大的博客
安全點 stw說明
偏向鎖

『叄』 jvm源碼精析 怎麼都是cpp

Attach是什麼
在講這個之前,我們先來點大家都知道的東西,當我們感覺線程一直卡在某個地方,想知道卡在哪裡,首先想到的是進行線程mp,而常用的命令是jstack ,我們就可以看到如下線程棧了
2014-06-18 12:56:14
Full thread mp Java HotSpot(TM) 64-Bit Server VM (24.51-b03 mixed mode):

"Attach Listener" daemon prio=5 tid=0x00007fb0c6800800 nid=0x440b waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Service Thread" daemon prio=5 tid=0x00007fb0c584d800 nid=0x5303 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=5 tid=0x00007fb0c482e000 nid=0x5103 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=5 tid=0x00007fb0c482c800 nid=0x4f03 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=5 tid=0x00007fb0c4815800 nid=0x4d03 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=5 tid=0x00007fb0c4813800 nid=0x3903 in Object.wait() [0x00000001187d2000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007aaa85568> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x00000007aaa85568> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189)

"Reference Handler" daemon prio=5 tid=0x00007fb0c4800000 nid=0x3703 in Object.wait() [0x00000001186cf000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007aaa850f0> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:503)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
- locked <0x00000007aaa850f0> (a java.lang.ref.Reference$Lock)

『肆』 Hotspot的源碼應該怎樣閱讀

如果你下的只是HotSpot VM的代碼的話那好辦,Oracle JDK 6/Oracle JDK 7/OpenJDK 6/OpenJDK 7里的HotSpot VM基本上目錄結構都是一樣的。

├—agent Serviceability Agent的客戶端實現
├—make 用來build出HotSpot的各種配置文件
├—src HotSpot VM的源代碼
│ ├—cpu CPU相關代碼(匯編器、模板解釋器、ad文件、部分runtime函數在這里實現)
│ ├—os 操作系相關代碼
│ ├—os_cpu 操作系統+CPU的組合相關的代碼
│ └—share 平台無關的共通代碼
│ ├—tools 工具
│ │ ├—hsdis 反匯編插件
│ │ ├—IdealGraphVisualizer 將server編譯器的中間代碼可視化的工具
│ │ ├—launcher 啟動程序「java」
│ │ ├—LogCompilation 將-XX:+LogCompilation輸出的日誌(hotspot.log)整理成更容易閱讀的格式的工具
│ │ └—ProjectCreator 生成Visual Studio的project文件的工具
│ └—vm HotSpot VM的核心代碼
│ ├—adlc 平台描述文件(上面的cpu或os_cpu里的*.ad文件)的編譯器
│ ├—asm 匯編器介面
│ ├—c1 client編譯器(又稱「C1」)
│ ├—ci 動態編譯器的公共服務/從動態編譯器到VM的介面
│ ├—classfile 類文件的處理(包括類載入和系統符號表等)
│ ├—code 動態生成的代碼的管理
│ ├—compiler 從VM調用動態編譯器的介面
│ ├—gc_implementation GC的實現
│ │ ├—concurrentMarkSweep Concurrent Mark Sweep GC的實現
│ │ ├—g1 Garbage-First GC的實現(不使用老的分代式GC框架)
│ │ ├—parallelScavenge ParallelScavenge GC的實現(server VM默認,不使用老的分代式GC框架)
│ │ ├—parNew ParNew GC的實現
│ │ └—shared GC的共通實現
│ ├—gc_interface GC的介面
│ ├—interpreter 解釋器,包括「模板解釋器」(官方版在用)和「C++解釋器」(官方版不在用)
│ ├—libadt 一些抽象數據結構
│ ├—memory 內存管理相關(老的分代式GC框架也在這里)
│ ├—oops HotSpot VM的對象系統的實現
│ ├—opto server編譯器(又稱「C2」或「Opto」)
│ ├—prims HotSpot VM的對外介面,包括部分標准庫的native部分和JVMTI實現
│ ├—runtime 運行時支持庫(包括線程管理、編譯器調度、鎖、反射等)
│ ├—services 主要是用來支持JMX之類的管理功能的介面
│ ├—shark 基於LLVM的JIT編譯器(官方版里沒有使用)
│ └—utilities 一些基本的工具類
└—test 單元測試

你看到的目錄結構應該是類似這樣的

閱讀全文

與hotspot源碼分析視頻相關的資料

熱點內容
linux查看文件許可權命令 瀏覽:685
安卓手游存檔怎麼用 瀏覽:761
linuxyum安裝ftp 瀏覽:690
村委會主任可以推行政命令嗎 瀏覽:102
電腦文件夾封面多張圖片 瀏覽:263
網吧總伺服器叫什麼 瀏覽:922
多個演算法解決同一個問題 瀏覽:455
小車解壓後我的購車發票呢 瀏覽:977
做app開發用什麼雲伺服器 瀏覽:177
linux網卡子介面 瀏覽:985
21歲職高畢業學程序員怎麼學 瀏覽:321
vs如何對單個文件編譯 瀏覽:6
為什麼有的電腦不能安裝python 瀏覽:75
金蝶迷你版加密狗檢測到過期 瀏覽:186
硬體描述語言編譯結果 瀏覽:655
程序員逆天改命 瀏覽:19
金斗雲伺服器 瀏覽:447
港口工程pdf 瀏覽:770
程序設計語言pdf 瀏覽:434
蔬菜價格上漲演算法 瀏覽:221