本系列主要講述JVM相關知識,作為本系列的第一篇文章,本文從Java為什麼是一個跨平臺的語音開始介紹,逐步引入Java虛擬機的概念,並給出一個JVM相關知識圖譜,可以讓讀者從一個高屋建瓴的角度明白JVM的強大和實用. ...
JVM(零):走入JVM
本系列主要講述JVM相關知識,作為本系列的第一篇文章,本文從Java為什麼是一個跨平臺的語音開始介紹,逐步引入Java虛擬機的概念,並給出一個JVM相關知識圖譜,可以讓讀者從一個高屋建瓴的角度明白JVM的強大和實用.
為什麼Java是跨平臺的語言
提到Java,就不得不提到Java的跨平臺特性,也就是所謂的"一次編寫,處處運行",其不像C/C++這種語言,它們的編譯是源代碼級的,編譯器需要直接把源代碼編譯成目標機器代碼,這樣的代碼在使用過程中,如果需要在其他機器上運行,則需要交付源代碼,重新進行編譯,有一定的危險性.
而Java是目標代碼的無關性.Java通過增加一層中間層,也就是JVM.將源代碼先編譯成平臺無關的JVM語言,再根據不同的機器編譯成不同的機器語言,從而實現了Java的跨平臺性.
在編程領域沒有什麼是加一層中間層解決不了的,如JVM,消息中間件等等.
JVM初探
說道JVM就要提到JDK,JRE這兩個概念,這3者是逐步包含在一起的.
- JVM: Java虛擬機,操作系統起的一個進程,模擬真機環境是,Java代碼運行的主要區域;
- JRE:JVM加上一些基礎jar包,Java代碼運行的最小環境配置,一般人員使用過程中只需要配置到這步就可以開始運行Java代碼了;
- JDK:包含JRE和一些開發編譯工具,如Javac,Javap等,是開發人員需要用到的工具,一般開發人員需要使用到全部.
大綱
上圖就是系列文章的大概.
首先我們要講到一個Java文件是如何經過Javac編譯器編譯成.class文件的,其中涉及到"編譯原理"中的內容,如詞法分析,語法分析,語義分析,代碼樹生成等.
ps:但筆者對"編譯原理"相關的知識也不是十分瞭解,在這裡也只能講個大概,詳細的編譯原理和過程有興趣的建議在書上詳細瀏覽.
然後講述.class文件的基本內容,其中包含Class常量類型,類信息,Field和Method信息等相關信息.
接著描述.class文件是如何載入到記憶體中的,包括類載入的機制,原理,過程和如何自定義一個類載入器.
最後涉及到JVM的重頭戲---JVM記憶體區域的劃分.描述JVM內部將記憶體劃分為哪幾個部分.其中每個部分存儲的內容和對應的特性.此外在這部分還會涉及到記憶體的分配回收策略以及回收過程的詳細描述和如何排查和避免記憶體泄露問題.
總結
第一篇文章在這裡就結束了.本文主要還是起到一個目錄的作用並讓讀者能從巨集觀的角度把握後續系列文章的脈絡.在這裡也立下一個Flag,希望自身能堅持寫完這些文章.
本系列文章主要借鑒自<深入分析JavaWeb技術內幕>和<深入理解Java虛擬機-JVM高級特性與最佳實踐>.
文章在公眾號"IceWang"第一手更新,有興趣的朋友可以關註公眾號,第一時間看到筆者分享的各項知識點,謝謝!筆芯.