JVM學習總結
JVM學習總結——基本概述
前言
最近在 b 站上看了宋紅康老師的 JVM 講解視訊,對 JVM 有了一個基本特此寫一些部落格來記錄我的一些理解和總結,部落格中所使用的部分圖片是由宋紅康老師畫,我這裡拿來使用一下,特此說明。
什麼是 JVM
學習一樣新的技術,我認為首先我們應該要先要了解他是什麼,有什麼用
JVM 是 Java Virtual Machine(Java虛擬機器)的縮寫,是用來幫助執行 java程式碼的,一開始學習 java 的時候,我就感到疑惑,為什麼使用 java 這門語言我們需要專門的去下一些 配件——JDK,並且還要配置環境變數,不能像 C 語言/ C++ 那種直接寫完程式碼就可以在命令視窗執行了,有一部分原因就是在於 JVM 。
首先,使用 JAVA 編寫的程式碼,我們的計算機是不能直接識別的,使用 JAVA 編寫的程式碼經過編譯器編譯後會生成一個位元組碼檔案,也就是我們使用 javac 命令對 .java 檔案編譯生成那個 class 檔案——位元組碼檔案,但是這個位元組碼檔案我們的計算機也是不能直接識別的,需要通過使用 JVM 進行一系列的處理,最終轉換成作業系統可以執行的機器碼檔案。
在 JVM 將位元組碼檔案轉換成作業系統可讀的懂的檔案的過程中,我們可以進行的許多操作,這樣的操作就叫做 JVM 優化,之所以需要對 JVM 進行優化是因為,在編寫 JAVA 程式程式碼過程中,我們可能會遇到很多 BUG,其中有些 BUG 在 JAVA 中稱為 Exception,有些 BUG 被稱為 Error,雖然在 oracle 的官方文件中我們可以看到,這兩個類是繼承與同一個父類的,但是觸發這兩種 BUG 的方式卻不同,Exception 通常是我們程式碼中寫的一些錯誤,可能導致空指標,除零異常等一系列的 Exception,但有些錯誤我們是光看程式碼是看不出來的,比如 StackOverFlowError,堆溢位這個 Error 就可能不會被顯示在程式碼中出現,有可能是在 JVM 中 設定的堆的大小不太夠或者其他一些原因,這種 BUG 就需要我們學習完 JVM 後才可以很好的處理。
JVM的具體組成部分
圖片來自宋紅康老師
從圖中我們可以看到,JVM具體由一下幾個部分組成:
- 類載入子系統
- 執行時資料區
- 執行引擎
- 本地方法介面
然而執行時資料區又是由五部分組成的
- 方法區
- 堆
- 程式計數器
- 本地方法棧
- 虛擬機器棧
其中需要知道的是,方法區和堆是執行緒共享的,這裡就會涉及到執行緒安全的問題,至於為什麼是執行緒共享的在後面部落格會有說明,而程式計數器和虛擬機器棧以及本地方法棧是執行緒私有的。
這就是我對 JVM 的基本概述,有錯誤的地方歡迎指標。
加油,打工人!
相關文章
- jvm總結JVM
- 學習總結
- ConstraintLayout 學習總結AI
- BOM學習總結
- tkinter學習總結
- vue學習總結Vue
- HSF學習總結
- ElasticSearch 學習總結Elasticsearch
- Storm學習總結ORM
- vue 學習總結Vue
- lua 學習總結
- Angularjs 學習總結AngularJS
- WebRTC學習總結Web
- GCD 學習總結GC
- CompletableFuture學習總結
- awk 學習總結
- MyBatis 學習總結MyBatis
- Maven學習總結Maven
- Ajax學習總結
- mysqlimport學習總結MySqlImport
- WorkFlow學習總結
- JNI 學習總結
- SVG學習總結SVG
- HTML學習總結HTML
- Mybatis學習總結MyBatis
- JavaWeb學習總結JavaWeb
- KUDU學習總結
- pandas 學習總結
- fetch學習總結
- MYSQL學習總結MySql
- 近期學習總結
- 【TS】學習總結
- SpringCloud 學習總結SpringGCCloud
- Kafka 總結學習Kafka
- Typescript學習總結TypeScript
- redis學習總結Redis
- Oracle學習總結Oracle
- python學習總結Python