JDK
-
全稱 Java SE Development Kit (Java 開發工具包)
-
JVM虛擬機:Java運行的地方
-
核心類庫:Java提前編好的東西
-
開發工具: javac,java,jdb,jhat
-
javac:Java編譯器,用于將Java源代碼編譯成Java字節碼文件(.class)。
-
java: java虛擬機,用于運行字節碼文件(.class)
-
jdb: java調試工具,用于debug
-
jhat:java分析工具,用于監測內存
-
......
-
JRE
-
JRE全稱 java Runtime Environment (Java運行時環境)。
-
JVM:Java虛擬機
-
核心類庫:Java提前編寫好的東西
-
運行工具
-
Java
-
......
-
總結
JDK 包含 JER 包含 JVM
編譯指令
# 將srcFile所指向的(.java)文件編譯成字節碼文件(.class) 到destdir指向的文件夾 javac -d destdir srcFile #java -d . srcFile (.)表示當前路徑 #destdir 一定是一個文件夾地址( D:/Main.class)默認Main.class為文件夾 ? #java 執行命令后面接的是(Java類名)不是class文件的名稱,也不是 Java 源文件 #名。 java Java類名 java - classpath dirl;dir2;dir3 .. .;dirN Java類
-
.java 源文件通常可以是任何名稱,但是當類中有一個public時,文件名和類名必須相同
-
所有javac 編譯不需要指定文件名稱只要路徑
-
默認文件名為源文件所定義的類名 如果一個.java文件有多個類那么就會為每個類創建.class
-
-classpath dirl;dir2;dir3 如果設置了classpath 環境變量 , Java 解釋器將只在 CLASSPATH 環境變量所指定的系列路徑中搜索 Java 類
###
jshell
JDK9 工具的大改進就是提供了 jshell 工具它是 REPL CRead-Eval-Print Loop (交互式的編程環境)工具 該工具是一個交互式的命令行界面,可用于執行 Java 語言的變量聲明、語句 表達式,而且可以立即看 到執行結果 因此,我們可以使用該工具來快速學習 Java 或測試 Java 的新 API
常用命令
-
/help
:顯示關于JShell命令的幫助信息。 -
/reset
:重置JShell,清除所有已輸入的內容。 -
/reload
:重新加載JShell文件,使得最新的更改生效。 -
/edit
:編輯先前輸入的代碼片段。 -
/list
:列出當前定義的所有變量、方法和類。 -
/vars
:列出當前定義的所有變量。 -
/methods
:列出當前定義的所有方法。 -
/types
:列出當前定義的所有類和接口。 -
/imports
:列出當前導入的所有包和類。 -
/exit
:退出JShell。
Java的垃圾回收機制
-
Serial收集器:Serial收集器是一種單線程的垃圾回收器,它使用標記-復制算法來回收內存。適用于小型應用或者客戶端應用。
-
Parallel收集器:Parallel收集器是Serial收集器的多線程版本,它也使用標記-復制算法。適用于高吞吐量的服務器應用。
-
CMS收集器:CMS(Concurrent Mark Sweep)收集器是一種并發的垃圾回收器,它使用標記-清除算法。它在應用程序運行期間和應用程序線程并發地進行垃圾回收。適用于對響應時間有較高要求的應用。
-
G1收集器:G1(Garbage First)收集器是一種面向服務器應用的垃圾回收器,它使用分代收集和標記-整理算法。它的特點是將堆內存劃分為多個區域,每個區域可以作為年輕代或老年代,同時進行并發標記和并發整理。適用于大內存應用和低延遲要求的應用。
-
ZGC收集器:ZGC(Z Garbage Collector)收集器是Java 11引入的一種低延遲的垃圾回收器。它使用了柔性的內存布局和無停頓的垃圾回收算法,可以在幾毫秒的時間內處理非常大的堆。適用于對延遲要求非常嚴格的應用。
-
標記-復制算法:
-
標記-復制算法是一種用于解決內存碎片問題的垃圾回收算法。它將堆內存分為兩個區域:一個用于存活對象,另一個用于新創建的對象。垃圾回收器首先在存活對象的區域中進行標記,然后將存活對象復制到另一個區域,最后清除原區域中的所有對象。這樣可以解決內存碎片問題,但是會產生內存浪費。
-
優點:高效,不會產生內存碎片。
-
缺點:會浪費一部分內存空間。
-
-
標記-清除算法:
-
標記-清除算法是一種較為簡單的垃圾回收算法。它分為兩個階段:標記階段和清除階段。在標記階段,垃圾回收器會標記所有活動對象;在清除階段,垃圾回收器會清除所有未被標記的對象。這種算法會產生內存碎片,并且在清除階段需要暫停應用程序。
-
優點:簡單,實現相對容易。
-
缺點:會產生內存碎片,并且在清除階段會暫停應用程序。
-
-
分代收集:
-
分代收集是一種優化垃圾回收效率的方法。根據對象的生命周期將堆內存劃分為不同的代(Generation),通常分為年輕代(Young Generation)和老年代(Old Generation)。年輕代中的對象生命周期較短,老年代中的對象生命周期較長。垃圾回收器會根據各代對象的特性采用不同的垃圾回收算法和策略,如標記-復制算法用于年輕代,標記-清除算法用于老年代。
-
優點:根據對象的生命周期采用不同的回收策略,提高了垃圾回收效率。
-
缺點:需要維護多個代,增加了復雜性。
-
-
標記-整理算法:
-
標記-整理算法是一種用于解決內存碎片問題的垃圾回收算法。它首先標記所有活動對象,然后將活動對象向一端移動,然后清理掉不再使用的內存空間。這樣可以使得內存空間連續,避免了內存碎片問題。
-
優點:解決了內存碎片問題,不會浪費內存空間。
-
缺點:需要移動對象,可能會導致一定的性能開銷。
-
-
柔性的內存布局和無停頓的垃圾回收算法:
-
柔性的內存布局和無停頓的垃圾回收算法是一種針對低延遲應用的垃圾回收技術。它采用了一系列技術來減少垃圾回收造成的停頓時間,如并發標記、并發清除、并發整理等。這種算法通常用于需要快速響應時間的應用場景,如金融交易、實時游戲等。
-
優點:減少了垃圾回收造成的停頓時間,提高了應用程序的響應速度。
-
缺點:實現相對復雜,可能會增加系統的開銷。
-
運行
.java --> 編譯(Compilation) --(.class)--> 加載(Loading) -->連接(Linking) -->初始化(Initialization) -->執行(Execution) -->卸載(Unloading)
-
編譯(Compilation): 將源文件編譯成字節碼文件(.class)
-
加載(Loading): JVM 將字節碼文件(.class)解釋或編譯成特定平臺的機器代碼加載到內存
-
連接(Linking):Java的鏈接過程與C++的鏈接不同。Java是在運行時進行鏈接的,稱為動態鏈接。
-
驗證:已經在加載階段提到,確保加載的類的二進制信息的正確性。
-
準備:同樣已經在加載階段提到。
-
解析:把類中的符號引用轉換為直接引用。
-
-
初始化(Initialization),Java虛擬機(JVM)會對類進行初始化,包括執行靜態變量的賦值和靜態代碼塊的初始化。
-
執行(Execution) : Java虛擬機開始執行程序。
-
卸載(Unloading):內存空間會被垃圾回收器回收,從而釋放內存資源。
c++
.c --> 預處理(Pre-processor) --(.i)->編譯(Compiler) -(.s)->匯編(Assmbler) --(.o)->連接(Liniker) -->.exe