1. JVM與Java體系結構
1.1 你是否也遇到過這些問題?
- 運行這的線上系統突然就卡死,系統無法訪問,甚至直接OOM
- 想解決向上JVM GC問題,但卻無從下手
- 新項目上線,對各種JVM參數設置一臉迷茫,直接默認吧,然後就JJ了
- 每次面試之前都要重新背一遍JVM的一些原理概念性的東西,然後面試官卻經常問你在實際項目中如何調優JVM參數,如何解決GC、OOM等問題,一臉懵逼。
以上情況都遇到過,而且不止一次
1.2 我們寫的應用程序結構
- 一些有一定工作經驗的開發人員,打心眼兒裏覺得SSM、微服務等上層技術纔是重點,基礎技術並不重要,這其實是一種本末倒置的病態。
- 如果我們把核心類庫的API比作數學公式的話,那麼Java虛擬機的只是就好不公式的推到過程。
1.3 我們爲什麼要學習JVM?
- 面試的需要(BATJ、TMD、PKQ等面試都愛問)
- 中高級程序員的必備技能(項目管理、調優的需要)
- 追求極客的精神(垃圾回收算法、JIT、底層原理)
垃圾收集機制爲我們打理了很多繁瑣的工作,大大提高了開發的效率,但是,垃圾收集也不是萬能的,懂得JVM內部的內存結構、工作機制,是設計高擴展性應用的基礎,也是Java工程師進階的必備能力。
1.4 Java生態圈
Java是目前最廣泛的軟件開發平臺之一。隨着Java以及Java社區的不斷壯大,Java也早已不再是簡簡單單的一門計算機語言了,它更是一個平臺、一種文化、一個社區。
- 作爲一個平臺,Java虛擬機扮演者舉足輕重的作用。
Groovy、Scala、JRuby、Kotlin等都是Java平臺的一部分 - 作爲一種文化,Java幾乎成爲了“開源”的代名詞。
- 第三方開源軟件和框架。如Tomcat、Struct、Mybatis、Spring等。
- Jdk和Jvm本身也有不少開源的實現,如OpenJDK、Harmony.
- 作爲一個社區,Java擁有全世界最多的技術擁護者和開源社區支持,有數不清的論壇和資料。從桌面應用軟件、嵌入式開發到企業級應用、後臺服務器、中間件、都可以看到Java的影子。
1.4.1 跨平臺的語言
Java語言在興起的時候,宣稱是編寫一次,到處運行。可以跨不同的平臺。
1.4.2 跨語言的平臺
Jdk是跨語言的平臺,只要符合java虛擬機的規範,都可以在jvm上運行。
- 隨着Java7的正式發佈,Java虛擬機的設計者們通過JSR-292規範基本實現在Java虛擬機平臺上運行非Java語言編寫的程序。
- Java虛擬機根本不關心運行在其內部的程序到底是使用何種語言編寫的,它只關心“字節碼”文件。也就是說Java虛擬機擁有語言無關性,並不會單純地與Java語言“終身綁定”,只要其他編程語言的編譯結果滿足幷包含Java虛擬機的內部指令集、符號表以及其他的輔助信息,它就是一個有效的字節碼文件,就能夠被虛擬機所識別並裝載運行。