
Java教程
- Java - 首頁
- Java - 概述
- Java - 歷史
- Java - 特性
- Java vs. C++
- JVM - Java虛擬機器
- Java - JDK vs JRE vs JVM
- Java - Hello World程式
- Java - 環境搭建
- Java - 基本語法
- Java - 變數型別
- Java - 資料型別
- Java - 型別轉換
- Java - Unicode系統
- Java - 基本運算子
- Java - 註釋
- Java - 使用者輸入
- Java - 日期與時間
Java控制語句
- Java - 迴圈控制
- Java - 決策機制
- Java - if-else
- Java - switch
- Java - for迴圈
- Java - 增強for迴圈
- Java - while迴圈
- Java - do-while迴圈
- Java - break
- Java - continue
面向物件程式設計
- Java - OOPs概念
- Java - 物件與類
- Java - 類屬性
- Java - 類方法
- Java - 方法
- Java - 變數作用域
- Java - 構造器
- Java - 訪問修飾符
- Java - 繼承
- Java - 聚合
- Java - 多型
- Java - 方法重寫
- Java - 方法過載
- Java - 動態繫結
- Java - 靜態繫結
- Java - 例項初始化塊
- Java - 抽象
- Java - 封裝
- Java - 介面
- Java - 包
- Java - 內部類
- Java - 靜態類
- Java - 匿名類
- Java - 單例類
- Java - 包裝類
- Java - 列舉
- Java - 列舉構造器
- Java - 列舉字串
Java內建類
Java檔案處理
Java錯誤與異常
- Java - 異常
- Java - try-catch塊
- Java - try-with-resources
- Java - 多重catch塊
- Java - 巢狀try塊
- Java - finally塊
- Java - throw異常
- Java - 異常傳播
- Java - 內建異常
- Java - 自定義異常
Java多執行緒
- Java - 多執行緒
- Java - 執行緒生命週期
- Java - 建立執行緒
- Java - 啟動執行緒
- Java - 執行緒連線
- Java - 執行緒命名
- Java - 執行緒排程器
- Java - 執行緒池
- Java - 主執行緒
- Java - 執行緒優先順序
- Java - 守護執行緒
- Java - 執行緒組
- Java - 關閉鉤子
Java同步
Java網路程式設計
- Java - 網路程式設計
- Java - Socket程式設計
- Java - URL處理
- Java - URL類
- Java - URLConnection類
- Java - HttpURLConnection類
- Java - Socket類
- Java - 泛型
Java集合
Java介面
Java資料結構
Java集合演算法
高階Java
- Java - 命令列引數
- Java - Lambda表示式
- Java - 傳送郵件
- Java - Applet基礎
- Java - Javadoc註釋
- Java - 自動裝箱和拆箱
- Java - 檔案不匹配方法
- Java - REPL (JShell)
- Java - 多發行版Jar檔案
- Java - 私有介面方法
- Java - 內部類菱形運算子
- Java - 多解析度影像API
- Java - 集合工廠方法
- Java - 模組系統
- Java - Nashorn JavaScript
- Java - Optional類
- Java - 方法引用
- Java - 函式式介面
- Java - 預設方法
- Java - Base64編碼解碼
- Java - switch表示式
- Java - Teeing Collectors
- Java - 微基準測試
- Java - 文字塊
- Java - 動態CDS歸檔
- Java - Z垃圾收集器 (ZGC)
- Java - 空指標異常
- Java - 打包工具
- Java - 密封類
- Java - 記錄類
- Java - 隱藏類
- Java - 模式匹配
- Java - 簡潔數字格式化
- Java - 垃圾回收
- Java - JIT編譯器
Java雜項
- Java - 遞迴
- Java - 正則表示式
- Java - 序列化
- Java - 字串
- Java - Process API改進
- Java - Stream API改進
- Java - 增強@Deprecated註解
- Java - CompletableFuture API改進
- Java - 流
- Java - 日期時間API
- Java 8 - 新特性
- Java 9 - 新特性
- Java 10 - 新特性
- Java 11 - 新特性
- Java 12 - 新特性
- Java 13 - 新特性
- Java 14 - 新特性
- Java 15 - 新特性
- Java 16 - 新特性
Java APIs與框架
Java類參考
- Java - Scanner
- Java - 陣列
- Java - 字串
- Java - Date
- Java - ArrayList
- Java - Vector
- Java - Stack
- Java - PriorityQueue
- Java - LinkedList
- Java - ArrayDeque
- Java - HashMap
- Java - LinkedHashMap
- Java - WeakHashMap
- Java - EnumMap
- Java - TreeMap
- Java - IdentityHashMap
- Java - HashSet
- Java - EnumSet
- Java - LinkedHashSet
- Java - TreeSet
- Java - BitSet
- Java - Dictionary
- Java - Hashtable
- Java - Properties
- Java - Collection
- Java - Array
Java實用資源
JVM(Java虛擬機器)架構
什麼是JVM(Java虛擬機器)?
JVM(Java虛擬機器)是一個虛擬機器,一個抽象的計算機,擁有自己的指令集架構(ISA)、記憶體、堆疊、堆等。它執行在主機作業系統上,並向其提出資源需求。
JVM(Java虛擬機器)是一個規範,只要符合規範,就可以有不同的實現。規範可以在以下連結中找到:https://docs.oracle.com
Oracle有自己的JVM實現(稱為HotSpot JVM),IBM也有自己的(例如J9 JVM)。
規範中定義的操作如下所示(來源 - Oracle JVM規範)
- “.class”檔案格式
- 資料型別
- 基本型別和值
- 引用型別和值
- 執行時資料區域
- 棧幀
- 物件的表示
- 浮點運算
- 特殊方法
- 異常
- 指令集摘要
- 類庫
- 公共設計,私有實現
JVM(Java虛擬機器)架構
HotSpot JVM 3 的架構如下所示:

執行引擎包含垃圾收集器和JIT編譯器。JVM有兩種型別:客戶端和伺服器端。兩者共享相同的執行時程式碼,但使用的JIT不同。稍後我們將詳細瞭解這一點。使用者可以透過指定JVM標誌 -client 或 -server 來控制使用哪種型別。伺服器端JVM是為伺服器上長期執行的Java應用程式設計的。
JVM有32位和64位版本。使用者可以使用VM引數中的-d32或-d64來指定要使用的版本。32位版本最多隻能定址4G記憶體。對於在記憶體中維護大型資料集的關鍵應用程式,64位版本可以滿足這一需求。
JVM(Java虛擬機器)架構的組成部分
以下是JVM(Java虛擬機器)架構的主要組成部分:
1. 類載入器
JVM以動態的方式管理載入、連結和初始化類和介面的過程。在載入過程中,JVM查詢類的二進位制表示並建立它。
在連結過程中,載入的類被組合到JVM的執行時狀態中,以便它們可以在初始化階段執行。JVM基本上使用儲存在類的方法區域的執行時常量池中的符號表來進行連結過程。初始化包括實際執行連結的類。
以下是類載入器的型別:
- 引導類載入器:此類載入器位於類載入器層次結構的頂部。它載入JRE的lib目錄中的標準JDK類。
- 擴充套件類載入器:此類載入器位於類載入器層次結構的中間,是引導類載入器的直接子類,載入JRE的lib\ext目錄中的類。
- 應用程式類載入器:此類載入器位於類載入器層次結構的底部,是應用程式類載入器的直接子類。它載入由CLASSPATH ENV變數指定的jar和類。
2. 連結和初始化
連結過程包含以下三個步驟:
- 驗證 - 這由位元組碼驗證器完成,以確保生成的.class檔案(位元組碼)有效。如果不是,則丟擲錯誤,連結過程停止。
- 準備 - 為類的所有靜態變數分配記憶體,並使用預設值初始化它們。
- 解析 - 所有符號記憶體引用都替換為原始引用。為此,使用了類的方法區域中執行時常量記憶體中的符號表。
初始化是類載入過程的最後階段。靜態變數被賦予原始值,並執行靜態塊。
3. 執行時資料區域
JVM規範定義了程式執行期間需要的某些執行時資料區域。其中一些在JVM啟動時建立。其他區域是特定於執行緒的,只有在建立執行緒時才建立(並在執行緒銷燬時銷燬)。這些列在下面:
PC(程式計數器)暫存器
它特定於每個執行緒,幷包含執行緒當前正在執行的JVM指令的地址。
棧
它特定於每個執行緒,在方法呼叫期間儲存引數、區域性變數和返回地址。如果執行緒請求的堆疊空間超過允許的範圍,則可能會發生StackOverflowError。如果堆疊是動態可擴充套件的,它仍然可以丟擲OutOfMemoryError。
堆
它被所有執行緒共享,包含在執行時建立的物件、類的元資料、陣列等。它在 JVM 啟動時建立,在 JVM 關閉時銷燬。您可以使用某些標誌控制 JVM 向作業系統請求的堆大小(稍後詳細介紹)。需要注意的是,不要請求過少或過多的記憶體,因為它會嚴重影響效能。此外,GC 管理此空間,並持續刪除不再使用的物件以釋放空間。
方法區
這個執行時區域對所有執行緒都是通用的,在 JVM 啟動時建立。它儲存每個類的結構,例如常量池(稍後詳細介紹)、建構函式和方法的程式碼、方法資料等。《Java 語言規範》(JLS) 沒有規定此區域是否需要進行垃圾回收,因此,JVM 的實現可以選擇忽略 GC。此外,它可以根據應用程式的需求進行擴充套件或不擴充套件。JLS 對此沒有任何強制規定。
執行時常量池
JVM 維護一個每個類/每個型別的、用作符號表(它的眾多角色之一)的資料結構,用於連結已載入的類。
本地方法棧
當執行緒呼叫本地方法時,它會進入一個新的環境,在這個環境中,Java 虛擬機器的結構和安全限制不再限制它的自由。本地方法可能會訪問虛擬機器的執行時資料區域(取決於本地方法介面),但也可能執行任何其他操作。
4. 執行引擎
執行引擎負責執行位元組碼,它包含三個不同的元件
垃圾回收
JVM 管理 Java 中物件的整個生命週期。一旦建立了物件,開發人員就不必再擔心它。如果物件變成不再使用(即,不再有對它的引用),它將由 GC 使用多種演算法(序列 GC、CMS、G1 等)從堆中移除。
另請閱讀: Java 中的垃圾回收
在 GC 過程中,物件會在記憶體中移動。因此,在該過程進行期間,這些物件不可用。整個應用程式必須在該過程持續時間內停止。此類暫停稱為“停止世界”暫停,並且開銷巨大。GC 演算法的主要目標是減少此時間。
直譯器
直譯器解釋位元組碼。它解釋程式碼的速度很快,但執行速度很慢。
JIT 編譯器
JIT 代表 Just-In-Time(即時)。JIT 編譯器是 Java 執行時環境的主要部分,它在執行時將位元組碼編譯為機器碼。
5. Java 本地介面 (JNI)
Java 本地介面 (JNI) 與對執行必不可少的本地方法庫互動。
6. 本地方法庫
本地方法庫是 C 和 C++ 庫(本地庫)的集合,對執行必不可少。