JVM和Java體系架構


前言

你是否也遇到過這些問題?

  1. 運行着的線上系統突然卡死,系統無法訪問,甚至直接OOM!

  2. 想解決線上JVM GC問題,但卻無從下手。

  3. 新項目上線,對各種JVM參數設置一臉茫然,直接默認吧然后就JJ了。

  4. 每次面試之前都要重新背一遍JVM的一些原理概念性的東西,然而面試官卻經常問你在實際項目中如何調優VM參數,如何解決GC、OOM等問題,一臉懵逼。

大部分Java開發人員,除了會在項目中使用到與Java平台相關的各種高精尖技術,對於Java技術的核心Java虛擬機了解甚少。

開發人員如何看待上層框架

  1. 一些有一定工作經驗的開發人員,打心眼兒里覺得SSM、微服務等上層技術才是重點,基礎技術並不重要,這其實是一種本末倒置的“病態”。
  2. 如果我們把核心類庫的API比做數學公式的話,那么Java虛擬機的知識就好比公式的推導過程。
  • 計算機系統體系對我們來說越來越遠,在不了解底層實現方式的前提下,通過高級語言很容易編寫程序代碼。但事實上計算機並不認識高級語言。

架構師每天都在思考什么?

  1. 應該如何讓我的系統更快?
  2. 如何避免系統出現瓶頸?

知乎上有條帖子:應該如何看招聘信息,直通年薪50萬+?

  1. 參與現有系統的性能優化,重構,保證平台性能和穩定性

  2. 根據業務場景和需求,決定技術方向,做技術選型

  3. 能夠獨立架構和設計海量數據下高並發分布式解決方案,滿足功能和非功能需求

  4. 解決各類潛在系統風險,核心功能的架構與代碼編寫

  5. 分析系統瓶頸,解決各種疑難雜症,性能調優等

我們為什么要學習JVM

  1. 面試的需要(BATJ、TMD,PKQ等面試都愛問)
  2. 中高級程序員必備技能
  • 項目管理、調優的需要
  1. 追求極客的精神,
  • 比如:垃圾回收算法、JIT、底層原理

Java VS C++

  1. 垃圾收集機制為我們打理了很多繁瑣的工作,大大提高了開發的效率,但是,垃圾收集也不是萬能的,懂得JVM內部的內存結構、工作機制,是設計高擴展性應用和診斷運行時問題的基礎,也是Java工程師進階的必備能力。
  2. C++語言需要程序員自己來分配內存和回收內存,對於高手來說可能更加舒服,但是對於普通開發者,如果技術實力不夠,很容易造成內存泄漏。而Java全部交給JVM進行內存分配和回收,這也是一種趨勢,減少程序員的工作量。

什么人需要學JVM?

  1. 擁有一定開發經驗的Java開發人員,希望升職加薪

  2. 軟件設計師,架構師

  3. 系統調優人員

  4. 虛擬機愛好者,JVM實踐者

推薦及參考書籍

官方文檔

英文文檔規范https://docs.oracle.com/javase/specs/index.html

**中文書籍:**

TIOBE排行榜

TIOBE 排行榜https://www.tiobe.com/tiobe-index/

  • 世界上沒有最好的編程語言,只有最適用於具體應用場景的編程語言。
  • 目前網上一直流傳Java被python,go撼動Java第一的地位。學習者不需要太擔心,Java強大的生態圈,也不是說是朝夕之間可以被撼動的。

Java生態圈

Java是目前應用最為廣泛的軟件開發平台之一。隨着Java以及Java社區的不斷壯大Java 也早已不再是簡簡單單的一門計算機語言了,它更是一個平台、一種文化、一個社區。

  1. 作為一個平台,Java虛擬機扮演着舉足輕重的作用
  • Groovy、Scala、JRuby、Kotlin等都是Java平台的一部分
  1. 作為一種文化,Java幾乎成為了“開源”的代名詞。
  • 第三方開源軟件和框架。如Tomcat、Struts,MyBatis,Spring等。
  • 就連JDK和JVM自身也有不少開源的實現,如openJDK、Harmony。
  1. 作為一個社區,Java擁有全世界最多的技術擁護者和開源社區支持,有數不清的論壇和資料。從桌面應用軟件、嵌入式開發到企業級應用、后台服務器、中間件,都可以看到Java的身影。其應用形式之復雜、參與人數之眾多也令人咋舌。

Java-跨平台的語言

JVM-跨語言的平台

  1. 隨着Java7的正式發布,Java虛擬機的設計者們通過JSR-292規范基本實現在Java虛擬機平台上運行非Java語言編寫的程序。
  2. Java虛擬機根本不關心運行在其內部的程序到底是使用何種編程語言編寫的,它只關心“字節碼”文件。也就是說Java虛擬機擁有語言無關性,並不會單純地與Java語言“終身綁定”,只要其他編程語言的編譯結果滿足並包含Java虛擬機的內部指令集、符號表以及其他的輔助信息,它就是一個有效的字節碼文件,就能夠被虛擬機所識別並裝載運行。
  • Java不是最強大的語言,但是JVM是最強大的虛擬機
  1. 我們平時說的java字節碼,指的是用java語言編譯成的字節碼。准確的說任何能在jvm平台上執行的字節碼格式都是一樣的。所以應該統稱為:jvm字節碼。

  2. 不同的編譯器,可以編譯出相同的字節碼文件,字節碼文件也可以在不同的JVM上運行。

  3. Java虛擬機與Java語言並沒有必然的聯系,它只與特定的二進制文件格式——Class文件格式所關聯,Class文件中包含了Java虛擬機指令集(或者稱為字節碼、Bytecodes)和符號表,還有一些其他輔助信息。

多語言混合編程

  1. Java平台上的多語言混合編程正成為主流,通過特定領域的語言去解決特定領域的問題是當前軟件開發應對日趨復雜的項目需求的一個方向。

  2. 試想一下,在一個項目之中,並行處理用Clojure語言編寫,展示層使用JRuby/Rails,中間層則是Java,每個應用層都將使用不同的編程語言來完成,而且,接口對每一層的開發者都是透明的,各種語言之間的交互不存在任何困難,就像使用自己語言的原生API一樣方便,因為它們最終都運行在一個虛擬機之上。

  3. 對這些運行於Java虛擬機之上、Java之外的語言,來自系統級的、底層的支持正在迅速增強,以JSR-292為核心的一系列項目和功能改進(如DaVinci Machine項目、Nashorn引擎、InvokeDynamic指令、java.lang.invoke包等),推動Java虛擬機從“Java語言的虛擬機”向 “多語言虛擬機”的方向發展。

如何真正搞懂JVM?

  1. Java虛擬機非常復雜,要想真正理解它的工作原理,最好的方式就是自己動手編寫一個!

  2. 自己動手寫一個Java虛擬機,難嗎?

  3. 天下事有難易乎?為之,則難者亦易矣;不為,則易者亦難矣

Java發展重大事件

  • 1990年,在Sun計算機公司中,由Patrick Naughton、MikeSheridan及James Gosling領導的小組Green Team,開發出的新的程序語言,命名為Oak,后期命名為Java

  • 1995年,Sun正式發布Java和HotJava產品,Java首次公開亮相。

  • 1996年1月23日Sun Microsystems發布了JDK 1.0。

  • 1998年,JDK1.2版本發布。同時,Sun發布了JSP/Servlet、EJB規范,以及將Java分成了J2EE、J2SE和J2ME。這表明了Java開始向企業、桌面應用和移動設備應用3大領域挺進。

  • 2000年,JDK1.3發布,Java HotSpot Virtual Machine正式發布,成為Java的默認虛擬機。

  • 2002年,JDK1.4發布,古老的Classic虛擬機退出歷史舞台。

  • 2003年年底,Java平台的scala正式發布,同年Groovy也加入了Java陣營。

  • 2004年,JDK1.5發布。同時JDK1.5改名為JavaSE5.0。

  • 2006年,JDK6發布。同年,Java開源並建立了OpenJDK。順理成章,Hotspot虛擬機也成為了OpenJDK中的默認虛擬機。

  • 2007年,Java平台迎來了新伙伴Clojure。

  • 2008年,oracle收購了BEA,得到了JRockit虛擬機。

  • 2009年,Twitter宣布把后台大部分程序從Ruby遷移到Scala,這是Java平台的又一次大規模應用。

  • 2010年,Oracle收購了Sun,獲得Java商標和最真價值的HotSpot虛擬機。此時,Oracle擁有市場占用率最高的兩款虛擬機HotSpot和JRockit,並計划在未來對它們進行整合:HotRockit。JCP組織管理Java語言

  • 2011年,JDK7發布。在JDK1.7u4中,正式啟用了新的垃圾回收器G1。

  • 2017年,JDK9發布。將G1設置為默認GC,替代CMS

  • 同年,IBM的J9開源,形成了現在的Open J9社區

  • 2018年,Android的Java侵權案判決,Google賠償Oracle計88億美元

  • 同年,Oracle宣告JavagE成為歷史名詞JDBC、JMS、Servlet贈予Eclipse基金會

  • 同年,JDK11發布,LTS版本的JDK,發布革命性的ZGC,調整JDK授權許可

  • 2019年,JDK12發布,加入RedHat領導開發的Shenandoah GC

Open JDK和Oracle JDK

  • 在JDK11之前,Oracle JDK中還會存在一些Open JDK中沒有的,閉源的功能。但在JDK11中,我們可以認為Open JDK和Oracle JDK代碼實質上已經達到完全一致的程度了。
  • 主要的區別就是兩者更新周期不一樣

虛擬機

虛擬機概念

  • 所謂虛擬機(Virtual Machine),就是一台虛擬的計算機。它是一款軟件,用來執行一系列虛擬計算機指令。大體上,虛擬機可以分為系統虛擬機和程序虛擬機。

  • 大名鼎鼎的Virtual Box,VMware就屬於系統虛擬機,它們完全是對物理計算機硬件的仿真(模擬),提供了一個可運行完整操作系統的軟件平台。

  • 程序虛擬機的典型代表就是Java虛擬機,它專門為執行單個計算機程序而設計,在Java虛擬機中執行的指令我們稱為Java字節碼指令。

  • 無論是系統虛擬機還是程序虛擬機,在上面運行的軟件都被限制於虛擬機提供的資源中。

Java虛擬機

  1. Java虛擬機是一台執行Java字節碼的虛擬計算機,它擁有獨立的運行機制,其運行的Java字節碼也未必由Java語言編譯而成。

  2. JVM平台的各種語言可以共享Java虛擬機帶來的跨平台性、優秀的垃圾回器,以及可靠的即時編譯器。

  3. Java技術的核心就是Java虛擬機(JVM,Java Virtual Machine),因為所有的Java程序都運行在Java虛擬機內部。

作用:

Java虛擬機就是二進制字節碼的運行環境,負責裝載字節碼到其內部,解釋/編譯為對應平台上的機器指令執行。每一條Java指令,Java虛擬機規范中都有詳細定義,如怎么取操作數,怎么處理操作數,處理結果放在哪里。

特點:

  1. 一次編譯,到處運行

  2. 自動內存管理

  3. 自動垃圾回收功能

JVM的位置

JVM是運行在操作系統之上的,它與硬件沒有直接的交互

JVM的整體結構

  1. HotSpot VM是目前市面上高性能虛擬機的代表作之一。

  2. 它采用解釋器與即時編譯器並存的架構。

  3. 在今天,Java程序的運行性能早已脫胎換骨,已經達到了可以和C/C++程序一較高下的地步。

Java代碼執行流程

凡是能生成被Java虛擬機所能解釋、運行的字節碼文件,那么理論上我們就可以自己設計一套語言了

JVM的架構模型

Java編譯器輸入的指令流基本上是一種基於棧的指令集架構,另外一種指令集架構則是基於寄存器的指令集架構。具體來說:這兩種架構之間的區別:

基於棧的指令集架構

基於棧式架構的特點:

  1. 設計和實現更簡單,適用於資源受限的系統;

  2. 避開了寄存器的分配難題:使用零地址指令方式分配

  3. 指令流中的指令大部分是零地址指令,其執行過程依賴於操作棧。指令集更小,編譯器容易實現

  4. 不需要硬件支持,可移植性更好,更好實現跨平台

基於寄存器的指令級架構

基於寄存器架構的特點:

  1. 典型的應用是x86的二進制指令集:比如傳統的PC以及Android的Davlik虛擬機。

  2. 指令集架構則完全依賴硬件,與硬件的耦合度高,可移植性差

  3. 性能優秀和執行更高效

  4. 花費更少的指令去完成一項操作

  5. 在大部分情況下,基於寄存器架構的指令集往往都以一地址指令、二地址指令和三地址指令為主,而基於棧式架構的指令集卻是以零地址指令為主

兩種架構的舉例

同樣執行2+3這種邏輯操作,其指令分別如下:

  • 基於棧的計算流程(以Java虛擬機為例):
iconst_2 //常量2入棧
istore_1
iconst_3 // 常量3入棧
istore_2
iload_1
iload_2
iadd //常量2/3出棧,執行相加
istore_0 // 結果5入棧
  • 8個指令
  • 而基於寄存器的計算流程
mov eax,2 //將eax寄存器的值設為1
add eax,3 //使eax寄存器的值加3
  • 2個指令

具體后面會講

JVM架構總結

  1. 由於跨平台性的設計,Java的指令都是根據棧來設計的。不同平台CPU架構不同,所以不能設計為基於寄存器的。棧的優點:跨平台,指令集小,編譯器容易實現,缺點是性能比寄存器差一些。
  2. 時至今日,盡管嵌入式平台已經不是Java程序的主流運行平台了(准確來說應該是HotSpot VM的宿主環境已經不局限於嵌入式平台了),那么為什么不將架構更換為基於寄存器的架構呢?
  • 因為基於棧的架構跨平台性好、指令集小,雖然相對於基於寄存器的架構來說,基於棧的架構編譯得到的指令更多,執行性能也不如基於寄存器的架構好,但考慮到其跨平台性與移植性,我們還是選用棧的架構

JVM的生命周期

虛擬機的啟動

Java虛擬機的啟動是通過引導類加載器(bootstrap class loader)創建一個初始類(initial class)來完成的,這個類是由虛擬機的具體實現指定的。

虛擬機的執行

  1. 一個運行中的Java虛擬機有着一個清晰的任務:執行Java程序

  2. 程序開始執行時他才運行,程序結束時他就停止

  3. 執行一個所謂的Java程序的時候,真真正正在執行的是一個叫做Java虛擬機的進程

虛擬機的退出

有如下的幾種情況:

  1. 程序正常執行結束

  2. 程序在執行過程中遇到了異常或錯誤而異常終止

  3. 由於操作系統用現錯誤而導致Java虛擬機進程終止

  4. 某線程調用Runtime類或System類的exit()方法,或Runtime類的halt()方法,並且Java安全管理器也允許這次exit()或halt()操作。

  5. 除此之外,JNI(Java Native Interface)規范描述了用JNI Invocation API來加載或卸載 Java虛擬機時,Java虛擬機的退出情況。

JVM發展歷程

Sun Classic VM

  1. 早在1996年Java1.0版本的時候,Sun公司發布了一款名為sun classic VM的Java虛擬機,它同時也是世界上第一款商用Java虛擬機,JDK1.4時完全被淘汰。

  2. 這款虛擬機內部只提供解釋器,沒有即時編譯器,因此效率比較低。【即時編譯器會把熱點代碼的本地機器指令緩存起來,那么以后使用熱點代碼的時候,效率就比較高】

  3. 如果使用JIT編譯器,就需要進行外掛。但是一旦使用了JIT編譯器,JIT就會接管虛擬機的執行系統。解釋器就不再工作,解釋器和編譯器不能配合工作。

  • 我們將字節碼指令翻譯成機器指令也是需要花時間的,如果只使用JIT,就需要把所有字節碼指令都翻譯成機器指令,就會導致翻譯時間過長,也就是說在程序剛啟動的時候,等待時間會很長。
  • 而解釋器就是走到哪,解釋到哪。
  1. 現在Hotspot內置了此虛擬機。

Exact VM

  1. 為了解決上一個虛擬機問題,jdk1.2時,Sun提供了此虛擬機。
  2. Exact Memory Management:准確式內存管理
  • 也可以叫Non-Conservative/Accurate Memory Management
  • 虛擬機可以知道內存中某個位置的數據具體是什么類型。
  1. 具備現代高性能虛擬機的維形
  • 熱點探測(尋找出熱點代碼進行緩存)
  • 編譯器與解釋器混合工作模式
  1. 只在Solaris平台短暫使用,其他平台上還是classic vm,英雄氣短,終被Hotspot虛擬機替換

HotSpot VM(重點)

  1. HotSpot歷史
  • 最初由一家名為“Longview Technologies”的小公司設計

  • 1997年,此公司被Sun收購;2009年,Sun公司被甲骨文收購。

  • JDK1.3時,HotSpot VM成為默認虛擬機

  1. 目前Hotspot占有絕對的市場地位,稱霸武林
  • 不管是現在仍在廣泛使用的JDK6,還是使用比例較多的JDK8中,默認的虛擬機都是HotSpot

  • Sun/oracle JDK和openJDK的默認虛擬機

  • 因此本課程中默認介紹的虛擬機都是HotSpot,相關機制也主要是指HotSpot的GC機制。(比如其他兩個商用虛機都沒有方法區的概念)

  1. 從服務器、桌面到移動端、嵌入式都有應用。
  2. 名稱中的HotSpot指的就是它的熱點代碼探測技術。
  • 通過計數器找到最具編譯價值代碼,觸發即時編譯或棧上替換
  • 通過編譯器與解釋器協同工作,在最優化的程序響應時間與最佳執行性能中取得平衡

JRockit(商用三大虛擬機之一)

  1. 專注於服務器端應用:它可以不太關注程序啟動速度,因此JRockit內部不包含解析器實現,全部代碼都靠即時編譯器編譯后執行。

  2. 大量的行業基准測試顯示,JRockit JVM是世界上最快的JVM:使用JRockit產品,客戶已經體驗到了顯著的性能提高(一些超過了70%)和硬件成本的減少(達50%)。

  3. 優勢:全面的Java運行時解決方案組合

  • JRockit面向延遲敏感型應用的解決方案JRockit Real Time提供以毫秒或微秒級的JVM響應時間,適合財務、軍事指揮、電信網絡的需要
  • Mission Control服務套件,它是一組以極低的開銷來監控、管理和分析生產環境中的應用程序的工具。
  1. 2008年,JRockit被Oracle收購。

  2. Oracle表達了整合兩大優秀虛擬機的工作,大致在JDK8中完成。整合的方式是在HotSpot的基礎上,移植JRockit的優秀特性。

  3. 高斯林:目前就職於谷歌,研究人工智能和水下機器人

IBM的J9(商用三大虛擬機之一)

  1. 全稱:IBM Technology for Java Virtual Machine,簡稱IT4J,內部代號:J9

  2. 市場定位與HotSpot接近,服務器端、桌面應用、嵌入式等多用途VM廣泛用於IBM的各種Java產品。

  3. 目前,有影響力的三大商用虛擬機之一,也號稱是世界上最快的Java虛擬機。

  4. 2017年左右,IBM發布了開源J9VM,命名為openJ9,交給Eclipse基金會管理,也稱為Eclipse OpenJ9

  5. OpenJDK -> 是JDK開源了,包括了虛擬機

KVM和CDC/CLDC Hotspot

  1. Oracle在Java ME產品線上的兩款虛擬機為:CDC/CLDC HotSpot Implementation VM

  2. KVM(Kilobyte)是CLDC-HI早期產品

  3. 目前移動領域地位尷尬,智能機被Android和iOS二分天下。

  4. KVM簡單、輕量、高度可移植,面向更低端的設備上還維持自己的一片市場

  • 智能控制器、傳感器
  • 老人手機、經濟欠發達地區的功能手機
  1. 所有的虛擬機的原則:一次編譯,到處運行。

Azul VM

  1. 前面三大“高性能Java虛擬機”使用在通用硬件平台上

  2. 這里Azul VW和BEA Liquid VM是與特定硬件平台綁定、軟硬件配合的專有虛擬機:高性能Java虛擬機中的戰斗機。

  3. Azul VM是Azul Systems公司在HotSpot基礎上進行大量改進,運行於Azul Systems公司的專有硬件Vega系統上的Java虛擬機。

  4. 每個Azul VM實例都可以管理至少數十個CPU和數百GB內存的硬件資源,並提供在巨大內存范圍內實現可控的GC時間的垃圾收集器、專有硬件優化的線程調度等優秀特性。

  5. 2010年,Azul Systems公司開始從硬件轉向軟件,發布了自己的Zing JVM,可以在通用x86平台上提供接近於Vega系統的特性。

Liquid VM

  1. 高性能Java虛擬機中的戰斗機。

  2. BEA公司開發的,直接運行在自家Hypervisor系統上

  3. Liquid VM即是現在的JRockit VE(Virtual Edition)。Liquid VM不需要操作系統的支持,或者說它自己本身實現了一個專用操作系統的必要功能,如線程調度、文件系統、網絡支持等

  4. 隨着JRockit虛擬機終止開發,Liquid vM項目也停止了。

Apache Marmony

  1. Apache也曾經推出過與JDK1.5和JDK1.6兼容的Java運行平台Apache Harmony。

  2. 它是IElf和Intel聯合開發的開源JVM,受到同樣開源的Open JDK的壓制,Sun堅決不讓Harmony獲得JCP認證,最終於2011年退役,IBM轉而參與OpenJDK

  3. 雖然目前並沒有Apache Harmony被大規模商用的案例,但是它的Java類庫代碼吸納進了Android SDK。

Micorsoft JVM

  1. 微軟為了在IE3瀏覽器中支持Java Applets,開發了Microsoft JVM。

  2. 只能在window平台下運行。但確是當時Windows下性能最好的Java VM。

  3. 1997年,Sun以侵犯商標、不正當競爭罪名指控微軟成功,賠了Sun很多錢。微軟WindowsXP SP3中抹掉了其VM。現在Windows上安裝的jdk都是HotSpot。

Taobao JVM

  1. 由AliJVM團隊發布。阿里,國內使用Java最強大的公司,覆蓋雲計算、金融、物流、電商等眾多領域,需要解決高並發、高可用、分布式的復合問題。有大量的開源產品。

  2. 基於OpenJDK開發了自己的定制版本AlibabaJDK,簡稱AJDK。是整個阿里Java體系的基石。

  3. 基於OpenJDK Hotspot VM發布的國內第一個優化、深度定制且開源的高性能服務器版Java虛擬機。

  • 創新的GCIH(GCinvisible heap)技術實現了off-heap,即將生命周期較長的Java對象從heap中移到heap之外,並且GC不能管理GCIH內部的Java對象,以此達到降低GC的回收頻率和提升GC的回收效率的目的

  • GCIH中的對象還能夠在多個Java虛擬機進程中實現共享

  • 使用crc32指令實現JvM intrinsic降低JNI的調用開銷

  • PMU hardware的Java profiling tool和診斷協助功能

  • 針對大數據場景的ZenGC

  1. taobao vm應用在阿里產品上性能高,硬件嚴重依賴inte1的cpu,損失了兼容性,但提高了性能
  • 目前已經在淘寶、天貓上線,把Oracle官方JvM版本全部替換了。

Dalvik VM

  1. 谷歌開發的,應用於Android系統,並在Android2.2中提供了JIT,發展迅猛。

  2. Dalvik VM只能稱作虛擬機,而不能稱作“Java虛擬機”,它沒有遵循 Java虛擬機規范

  3. 不能直接執行Java的Class文件

  4. 基於寄存器架構,不是jvm的棧架構。

  5. 執行的是編譯以后的dex(Dalvik Executable)文件。執行效率比較高。

  • 它執行的dex(Dalvik Executable)文件可以通過class文件轉化而來,使用Java語法編寫應用程序,可以直接使用大部分的Java API等。
  1. Android 5.0使用支持提前編譯(Ahead of Time Compilation,AoT)的ART VM替換Dalvik VM。

Graal VM(未來虛擬機)

  1. 2018年4月,Oracle Labs公開了GraalvM,號稱 “Run Programs Faster Anywhere”,勃勃野心。與1995年java的”write once,run anywhere”遙相呼應。

  2. GraalVM在HotSpot VM基礎上增強而成的跨語言全棧虛擬機,可以作為“任何語言”的運行平台使用。語言包括:Java、Scala、Groovy、Kotlin;C、C++、Javascript、Ruby、Python、R等

  3. 支持不同語言中混用對方的接口和對象,支持這些語言使用已經編寫好的本地庫文件

  4. 工作原理是將這些語言的源代碼或源代碼編譯后的中間格式,通過解釋器轉換為能被Graal VM接受的中間表示。Graal VM提供Truffle工具集快速構建面向一種新語言的解釋器。在運行時還能進行即時編譯優化,獲得比原生編譯器更優秀的執行效率。

  5. 如果說HotSpot有一天真的被取代,Graalvm希望最大。但是Java的軟件生態沒有絲毫變化。

總結

具體JVM的內存結構,其實取決於其實現,不同廠商的JVM,或者同一廠商發布的不同版本,都有可能存在一定差異。主要以Oracle HotSpot VM為默認虛擬機。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM